@@ -567,6 +567,91 @@ fn cleanup_type_string(input: &str, fmt_for_text: bool, kcl_std: &ModData) -> St
567567 tys. join ( if fmt_for_text { " or " } else { " | " } )
568568}
569569
570+ #[ test]
571+ fn test_cleanup_type_string ( ) {
572+ enum Expected {
573+ Value ( & ' static str ) ,
574+ Panic ,
575+ }
576+
577+ struct Case {
578+ input : & ' static str ,
579+ expected_code : Expected ,
580+ expected_text : Expected ,
581+ }
582+
583+ use Expected :: { Panic , Value } ;
584+
585+ let kcl_std = crate :: docs:: kcl_doc:: walk_prelude ( ) ;
586+ let cases = [
587+ Case {
588+ input : "[[Solid; 2]]" ,
589+ expected_code : Value ( "[[Solid; 2]]" ) ,
590+ expected_text : Value ( "`[[Solid; 2]]`" ) ,
591+ } ,
592+ Case {
593+ input : "[Solid; 1+]" ,
594+ expected_code : Value ( "[Solid; 1+]" ) ,
595+ expected_text : Value ( "[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid)" ) ,
596+ } ,
597+ Case {
598+ input : "[Solid; 1+] | ImportedGeometry" ,
599+ expected_code : Value ( "[Solid; 1+] | ImportedGeometry" ) ,
600+ expected_text : Value (
601+ "[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry)" ,
602+ ) ,
603+ } ,
604+ Case {
605+ input : "[Solid | Sketch; 1+]" ,
606+ expected_code : Panic ,
607+ expected_text : Panic ,
608+ } ,
609+ Case {
610+ input : "[Solid | Sketch; 1+] | ImportedGeometry" ,
611+ expected_code : Value ( "[Solid | Sketch; 1+] | ImportedGeometry" ) ,
612+ expected_text : Value (
613+ "`[Solid` or `Sketch; 1+]` or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry)" ,
614+ ) ,
615+ } ,
616+ ] ;
617+
618+ for case in cases {
619+ match case. expected_code {
620+ Value ( expected) => {
621+ let actual = cleanup_type_string ( case. input , false , & kcl_std) ;
622+ assert_eq ! ( actual, expected, "fmt_for_text=false failed for input {}" , case. input) ;
623+ }
624+ Panic => {
625+ let result = std:: panic:: catch_unwind ( std:: panic:: AssertUnwindSafe ( || {
626+ cleanup_type_string ( case. input , false , & kcl_std)
627+ } ) ) ;
628+ assert ! (
629+ result. is_err( ) ,
630+ "fmt_for_text=false expected panic for input {}" ,
631+ case. input
632+ ) ;
633+ }
634+ }
635+
636+ match case. expected_text {
637+ Value ( expected) => {
638+ let actual = cleanup_type_string ( case. input , true , & kcl_std) ;
639+ assert_eq ! ( actual, expected, "fmt_for_text=true failed for input {}" , case. input) ;
640+ }
641+ Panic => {
642+ let result = std:: panic:: catch_unwind ( std:: panic:: AssertUnwindSafe ( || {
643+ cleanup_type_string ( case. input , true , & kcl_std)
644+ } ) ) ;
645+ assert ! (
646+ result. is_err( ) ,
647+ "fmt_for_text=true expected panic for input {}" ,
648+ case. input
649+ ) ;
650+ }
651+ }
652+ }
653+ }
654+
570655#[ test]
571656fn test_generate_stdlib_markdown_docs ( ) {
572657 let kcl_std = crate :: docs:: kcl_doc:: walk_prelude ( ) ;
@@ -650,3 +735,53 @@ async fn run_example(text: &str) -> Result<()> {
650735 ctx. run ( & program, & mut exec_state) . await ?;
651736 Ok ( ( ) )
652737}
738+
739+ #[ cfg( test) ]
740+ mod tests {
741+ use super :: * ;
742+
743+ #[ test]
744+ fn test_cleanup_type_string ( ) {
745+ let kcl_std = crate :: docs:: kcl_doc:: walk_prelude ( ) ;
746+
747+ struct Test {
748+ input : & ' static str ,
749+ expected_text : & ' static str ,
750+ expected_no_text : & ' static str ,
751+ }
752+
753+ let tests = [
754+ Test {
755+ input : "v" ,
756+ expected_text : "`v`" ,
757+ expected_no_text : "v" ,
758+ } ,
759+ Test {
760+ input : "number(mm)" ,
761+ expected_text : "[`number(mm)`](/docs/kcl-std/types/std-types-number)" ,
762+ expected_no_text : "number(mm)" ,
763+ } ,
764+ Test {
765+ input : "number(mm) | string" ,
766+ expected_text : "[`number(mm)`](/docs/kcl-std/types/std-types-number) or [`string`](/docs/kcl-std/types/std-types-string)" ,
767+ expected_no_text : "number(mm) | string" ,
768+ } ,
769+ Test {
770+ input : "[string; 1+]" ,
771+ expected_text : "[`[string; 1+]`](/docs/kcl-std/types/std-types-string)" ,
772+ expected_no_text : "[string; 1+]" ,
773+ } ,
774+ Test {
775+ input : "[string; 1+] | number(mm)" ,
776+ expected_text : "[`[string; 1+]`](/docs/kcl-std/types/std-types-string) or [`number(mm)`](/docs/kcl-std/types/std-types-number)" ,
777+ expected_no_text : "[string; 1+] | number(mm)" ,
778+ } ,
779+ ] ;
780+ for test in tests {
781+ let actual_text = cleanup_type_string ( test. input , true , & kcl_std) ;
782+ assert_eq ! ( actual_text, test. expected_text) ;
783+ let actual_no_text = cleanup_type_string ( test. input , false , & kcl_std) ;
784+ assert_eq ! ( actual_no_text, test. expected_no_text) ;
785+ }
786+ }
787+ }
0 commit comments