@@ -369,3 +369,254 @@ func TestCamelCaseWithSlice(t *testing.T) {
369369 })
370370 }
371371}
372+
373+ func TestKebabCase (t * testing.T ) {
374+ tests := []struct {
375+ name string
376+ input string
377+ expected string
378+ separator string
379+ }{
380+ {
381+ name : "camelCase to kebab-case" ,
382+ input : "camelCase" ,
383+ expected : "camel-case" ,
384+ },
385+ {
386+ name : "PascalCase to kebab-case" ,
387+ input : "PascalCase" ,
388+ expected : "pascal-case" ,
389+ },
390+ {
391+ name : "snake_case to kebab-case" ,
392+ input : "snake_case" ,
393+ expected : "snake-case" ,
394+ },
395+ {
396+ name : "XMLHttpRequest to kebab-case" ,
397+ input : "XMLHttpRequest" ,
398+ expected : "xml-http-request" ,
399+ },
400+ {
401+ name : "custom separator" ,
402+ input : "camelCase" ,
403+ expected : "camel|case" ,
404+ separator : "|" ,
405+ },
406+ {
407+ name : "empty string" ,
408+ input : "" ,
409+ expected : "" ,
410+ },
411+ {
412+ name : "single word" ,
413+ input : "word" ,
414+ expected : "word" ,
415+ },
416+ }
417+
418+ for _ , tt := range tests {
419+ t .Run (tt .name , func (t * testing.T ) {
420+ var result string
421+
422+ if tt .separator != "" {
423+ result = sx .KebabCase (tt .input , tt .separator )
424+ } else {
425+ result = sx .KebabCase (tt .input )
426+ }
427+
428+ if result != tt .expected {
429+ t .Errorf ("KebabCase(%q) = %q, want %q" , tt .input , result , tt .expected )
430+ }
431+ })
432+ }
433+ }
434+
435+ func TestSnakeCase (t * testing.T ) {
436+ tests := []struct {
437+ name string
438+ input string
439+ expected string
440+ }{
441+ {
442+ name : "camelCase to snake_case" ,
443+ input : "camelCase" ,
444+ expected : "camel_case" ,
445+ },
446+ {
447+ name : "PascalCase to snake_case" ,
448+ input : "PascalCase" ,
449+ expected : "pascal_case" ,
450+ },
451+ {
452+ name : "kebab-case to snake_case" ,
453+ input : "kebab-case" ,
454+ expected : "kebab_case" ,
455+ },
456+ {
457+ name : "XMLHttpRequest to snake_case" ,
458+ input : "XMLHttpRequest" ,
459+ expected : "xml_http_request" ,
460+ },
461+ {
462+ name : "empty string" ,
463+ input : "" ,
464+ expected : "" ,
465+ },
466+ {
467+ name : "single word" ,
468+ input : "word" ,
469+ expected : "word" ,
470+ },
471+ }
472+
473+ for _ , tt := range tests {
474+ t .Run (tt .name , func (t * testing.T ) {
475+ result := sx .SnakeCase (tt .input )
476+ if result != tt .expected {
477+ t .Errorf ("SnakeCase(%q) = %q, want %q" , tt .input , result , tt .expected )
478+ }
479+ })
480+ }
481+ }
482+
483+ func TestTrainCase (t * testing.T ) {
484+ tests := []struct {
485+ name string
486+ input string
487+ expected string
488+ options []sx.CaseOption
489+ }{
490+ {
491+ name : "camelCase to Train-Case" ,
492+ input : "camelCase" ,
493+ expected : "Camel-Case" ,
494+ },
495+ {
496+ name : "snake_case to Train-Case" ,
497+ input : "snake_case" ,
498+ expected : "Snake-Case" ,
499+ },
500+ {
501+ name : "XMLHttpRequest to Train-Case" ,
502+ input : "XMLHttpRequest" ,
503+ expected : "XML-Http-Request" ,
504+ },
505+ {
506+ name : "XMLHttpRequest normalized" ,
507+ input : "XMLHttpRequest" ,
508+ expected : "Xml-Http-Request" ,
509+ options : []sx.CaseOption {sx .WithNormalize (true )},
510+ },
511+ {
512+ name : "empty string" ,
513+ input : "" ,
514+ expected : "" ,
515+ },
516+ {
517+ name : "single word" ,
518+ input : "word" ,
519+ expected : "Word" ,
520+ },
521+ }
522+
523+ for _ , tt := range tests {
524+ t .Run (tt .name , func (t * testing.T ) {
525+ result := sx .TrainCase (tt .input , tt .options ... )
526+ if result != tt .expected {
527+ t .Errorf ("TrainCase(%q) = %q, want %q" , tt .input , result , tt .expected )
528+ }
529+ })
530+ }
531+ }
532+
533+ func TestFlatCase (t * testing.T ) {
534+ tests := []struct {
535+ name string
536+ input string
537+ expected string
538+ }{
539+ {
540+ name : "camelCase to flatcase" ,
541+ input : "camelCase" ,
542+ expected : "camelcase" ,
543+ },
544+ {
545+ name : "PascalCase to flatcase" ,
546+ input : "PascalCase" ,
547+ expected : "pascalcase" ,
548+ },
549+ {
550+ name : "kebab-case to flatcase" ,
551+ input : "kebab-case" ,
552+ expected : "kebabcase" ,
553+ },
554+ {
555+ name : "XMLHttpRequest to flatcase" ,
556+ input : "XMLHttpRequest" ,
557+ expected : "xmlhttprequest" ,
558+ },
559+ {
560+ name : "empty string" ,
561+ input : "" ,
562+ expected : "" ,
563+ },
564+ {
565+ name : "single word" ,
566+ input : "Word" ,
567+ expected : "word" ,
568+ },
569+ }
570+
571+ for _ , tt := range tests {
572+ t .Run (tt .name , func (t * testing.T ) {
573+ result := sx .FlatCase (tt .input )
574+ if result != tt .expected {
575+ t .Errorf ("FlatCase(%q) = %q, want %q" , tt .input , result , tt .expected )
576+ }
577+ })
578+ }
579+ }
580+
581+ func TestEdgeCases (t * testing.T ) {
582+ tests := []struct {
583+ name string
584+ input string
585+ function func (string ) string
586+ expected string
587+ }{
588+ {
589+ name : "unicode characters" ,
590+ input : "helloWörld" ,
591+ function : func (s string ) string { return sx .CamelCase (s ) },
592+ expected : "helloWörld" ,
593+ },
594+ {
595+ name : "numbers in string" ,
596+ input : "html5Parser" ,
597+ function : func (s string ) string { return sx .PascalCase (s ) },
598+ expected : "Html5Parser" ,
599+ },
600+ {
601+ name : "consecutive uppercase" ,
602+ input : "HTTPSConnection" ,
603+ function : func (s string ) string { return sx .KebabCase (s ) },
604+ expected : "https-connection" ,
605+ },
606+ {
607+ name : "mixed separators" ,
608+ input : "hello_world-test.case/example" ,
609+ function : func (s string ) string { return sx .CamelCase (s ) },
610+ expected : "helloWorldTestCaseExample" ,
611+ },
612+ }
613+
614+ for _ , tt := range tests {
615+ t .Run (tt .name , func (t * testing.T ) {
616+ result := tt .function (tt .input )
617+ if result != tt .expected {
618+ t .Errorf ("Function(%q) = %q, want %q" , tt .input , result , tt .expected )
619+ }
620+ })
621+ }
622+ }
0 commit comments