@@ -3,10 +3,12 @@ import {
33 COLLECTION_FIELD_HEADER_FAKE_DATA ,
44 FIELD_SET_HEADER_FAKE_DATA ,
55 JSON_SCHEMA_COLLECTION_FIELD_FAKE_DATA ,
6+ JSON_SCHEMA_COMMA_DECIMAL_NUMBERS ,
67 JSON_SCHEMA_DATE_TIME_FIELD_SETS ,
78 JSON_SCHEMA_DEFAULT_VALUES ,
89 JSON_SCHEMA_DUPLICATED_CHOICES_SINGLE_SELECT_FAKE_DATA ,
910 JSON_SCHEMA_DUPLICATED_REQUIRED_PROPERTIES_FAKE_DATA ,
11+ JSON_SCHEMA_EDGE_CASE_NUMBERS ,
1012 JSON_SCHEMA_EMPTY_CHOICES_FAKE_DATA ,
1113 JSON_SCHEMA_FIELD_SETS_FAKE_DATA ,
1214 JSON_SCHEMA_ID_$SCHEMA_FAKE_DATA ,
@@ -26,6 +28,7 @@ import expectedUISchema from "../common/mockData/uiSchemaExpectedMock.json";
2628import expectedFieldSetUISchema from "../common/mockData/uiSchemaFielSetExpectedMock.json" ;
2729import { generateUISchema } from "../src/generateUISchema" ;
2830import { validateJSONSchema } from "../src/validateJsonSchema" ;
31+ import { normalizeDecimalSeparators } from "../src/utils/utils" ;
2932
3033describe ( "JSON Schema validation" , ( ) => {
3134 it ( "Special chars should throw an exception" , ( ) => {
@@ -170,6 +173,82 @@ describe("JSON Schema validation", () => {
170173 const validSchema = validateJSONSchema ( JSON . stringify ( jsonSchema ) ) ;
171174 expect ( validSchema ) . toMatchObject ( expectedSchema ) ;
172175 } ) ;
176+
177+ it ( "Validate comma decimal separators are converted to periods" , ( ) => {
178+ const validSchema = validateJSONSchema ( JSON_SCHEMA_COMMA_DECIMAL_NUMBERS ) ;
179+
180+ // Check that comma decimals are converted to periods
181+ expect ( validSchema . schema . properties . price_with_comma . default ) . toBe ( "12.99" ) ;
182+ expect ( validSchema . schema . properties . price_with_comma . minimum ) . toBe ( "5.50" ) ;
183+ expect ( validSchema . schema . properties . price_with_comma . maximum ) . toBe ( "100.00" ) ;
184+
185+ // Check negative numbers
186+ expect ( validSchema . schema . properties . negative_number . default ) . toBe ( "-15.75" ) ;
187+
188+ // Check that regular numbers are unchanged
189+ expect ( validSchema . schema . properties . regular_number . default ) . toBe ( 25.50 ) ;
190+ expect ( validSchema . schema . properties . regular_number . minimum ) . toBe ( 0.01 ) ;
191+
192+ // Check that string fields are not affected
193+ expect ( validSchema . schema . properties . string_field . default ) . toBe ( "12,99 text" ) ;
194+ } ) ;
195+
196+ it ( "Validates edge cases for decimal separator conversion" , ( ) => {
197+ const validSchema = validateJSONSchema ( JSON_SCHEMA_EDGE_CASE_NUMBERS ) ;
198+
199+ // Should NOT convert numbers with thousands separators (European format: 1.234,56)
200+ expect ( validSchema . schema . properties . thousands_separator . default ) . toBe ( "1.234,56" ) ;
201+
202+ // Should NOT convert numbers with multiple commas (thousands: 1,234,567)
203+ expect ( validSchema . schema . properties . multiple_commas . default ) . toBe ( "1,234,567" ) ;
204+
205+ // Should leave empty defaults unchanged
206+ expect ( validSchema . schema . properties . empty_default . default ) . toBe ( "" ) ;
207+
208+ // Should leave null defaults unchanged
209+ expect ( validSchema . schema . properties . null_default . default ) . toBe ( null ) ;
210+
211+ // Should convert simple comma decimal (0,00 -> 0.00)
212+ expect ( validSchema . schema . properties . zero_comma . default ) . toBe ( "0.00" ) ;
213+ } ) ;
214+ } ) ;
215+
216+ describe ( "Decimal separator normalization" , ( ) => {
217+ it ( "Converts comma decimal separators to periods" , ( ) => {
218+ expect ( normalizeDecimalSeparators ( "12,99" ) ) . toBe ( "12.99" ) ;
219+ expect ( normalizeDecimalSeparators ( "-15,75" ) ) . toBe ( "-15.75" ) ;
220+ expect ( normalizeDecimalSeparators ( "0,01" ) ) . toBe ( "0.01" ) ;
221+ expect ( normalizeDecimalSeparators ( "1000,50" ) ) . toBe ( "1000.50" ) ;
222+ } ) ;
223+
224+ it ( "Leaves period decimal separators unchanged" , ( ) => {
225+ expect ( normalizeDecimalSeparators ( "12.99" ) ) . toBe ( "12.99" ) ;
226+ expect ( normalizeDecimalSeparators ( "-15.75" ) ) . toBe ( "-15.75" ) ;
227+ expect ( normalizeDecimalSeparators ( "0.01" ) ) . toBe ( "0.01" ) ;
228+ } ) ;
229+
230+ it ( "Leaves numbers unchanged" , ( ) => {
231+ expect ( normalizeDecimalSeparators ( 12.99 ) ) . toBe ( 12.99 ) ;
232+ expect ( normalizeDecimalSeparators ( - 15.75 ) ) . toBe ( - 15.75 ) ;
233+ expect ( normalizeDecimalSeparators ( 0 ) ) . toBe ( 0 ) ;
234+ } ) ;
235+
236+ it ( "Does not affect strings that are not decimal numbers" , ( ) => {
237+ expect ( normalizeDecimalSeparators ( "12,99 text" ) ) . toBe ( "12,99 text" ) ;
238+ expect ( normalizeDecimalSeparators ( "text 12,99" ) ) . toBe ( "text 12,99" ) ;
239+ expect ( normalizeDecimalSeparators ( "12,99,00" ) ) . toBe ( "12,99,00" ) ; // Multiple commas
240+ expect ( normalizeDecimalSeparators ( "abc" ) ) . toBe ( "abc" ) ;
241+ expect ( normalizeDecimalSeparators ( "" ) ) . toBe ( "" ) ;
242+ expect ( normalizeDecimalSeparators ( " " ) ) . toBe ( " " ) ;
243+ } ) ;
244+
245+ it ( "Handles edge cases properly" , ( ) => {
246+ expect ( normalizeDecimalSeparators ( null ) ) . toBe ( null ) ;
247+ expect ( normalizeDecimalSeparators ( undefined ) ) . toBe ( undefined ) ;
248+ expect ( normalizeDecimalSeparators ( " 12,99 " ) ) . toBe ( "12.99" ) ; // Trims whitespace
249+ expect ( normalizeDecimalSeparators ( "12," ) ) . toBe ( "12," ) ; // No digits after comma
250+ expect ( normalizeDecimalSeparators ( ",99" ) ) . toBe ( ",99" ) ; // No digits before comma
251+ } ) ;
173252} ) ;
174253
175254describe ( "JSON UI Schema generation" , ( ) => {
0 commit comments