@@ -635,7 +635,7 @@ user.password=Contraseña
635635 "en" : {
636636 "stringUnit" : {
637637 "state" : "translated",
638- "value" : "Hello!",
638+ "value" : "Hello!"
639639 },
640640 },
641641 },
@@ -757,6 +757,141 @@ user.password=Contraseña
757757 flag : "w" ,
758758 } ) ;
759759 } ) ;
760+
761+ it ( "should maintain ASCII ordering with whitespace and special characters" , async ( ) => {
762+ setupFileMocks ( ) ;
763+
764+ const input = `{
765+ "sourceLanguage" : "en",
766+ "strings" : {
767+ "" : {
768+
769+ },
770+ " " : {
771+
772+ },
773+ " and " : {
774+ "extractionState" : "manual",
775+ "localizations" : {
776+ "en" : {
777+ "stringUnit" : {
778+ "state" : "translated",
779+ "value" : " and "
780+ }
781+ },
782+ }
783+ },
784+ "25" : {
785+ "extractionState" : "manual",
786+ "localizations" : {
787+ "en" : {
788+ "stringUnit" : {
789+ "state" : "translated",
790+ "value" : "25"
791+ }
792+ }
793+ }
794+ },
795+ "apple" : {
796+ "extractionState" : "manual",
797+ "localizations" : {
798+ "en" : {
799+ "stringUnit" : {
800+ "state" : "translated",
801+ "value" : "apple"
802+ }
803+ }
804+ }
805+ }
806+ },
807+ "version" : "1.0"
808+ }` . trim ( ) ;
809+
810+ const payloadAr = {
811+ "" : "" ,
812+ " " : "" ,
813+ "%20and%20" : " و " ,
814+ "25" : "25" ,
815+ apple : "تفاحة" ,
816+ } ;
817+
818+ const expectedOutput = `{
819+ "sourceLanguage" : "en",
820+ "strings" : {
821+ "" : {
822+
823+ },
824+ " " : {
825+
826+ },
827+ " and " : {
828+ "extractionState" : "manual",
829+ "localizations" : {
830+ "ar" : {
831+ "stringUnit" : {
832+ "state" : "translated",
833+ "value" : " و "
834+ }
835+ },
836+ "en" : {
837+ "stringUnit" : {
838+ "state" : "translated",
839+ "value" : " and "
840+ }
841+ }
842+ }
843+ },
844+ "25" : {
845+ "extractionState" : "manual",
846+ "localizations" : {
847+ "ar" : {
848+ "stringUnit" : {
849+ "state" : "translated",
850+ "value" : "25"
851+ }
852+ },
853+ "en" : {
854+ "stringUnit" : {
855+ "state" : "translated",
856+ "value" : "25"
857+ }
858+ }
859+ }
860+ },
861+ "apple" : {
862+ "extractionState" : "manual",
863+ "localizations" : {
864+ "ar" : {
865+ "stringUnit" : {
866+ "state" : "translated",
867+ "value" : "تفاحة"
868+ }
869+ },
870+ "en" : {
871+ "stringUnit" : {
872+ "state" : "translated",
873+ "value" : "apple"
874+ }
875+ }
876+ }
877+ }
878+ },
879+ "version" : "1.0"
880+ }` . trim ( ) ;
881+
882+ mockFileOperations ( input ) ;
883+
884+ const xcodeXcstringsLoader = createBucketLoader ( "xcode-xcstrings" , "Localizable.xcstrings" ) ;
885+ xcodeXcstringsLoader . setDefaultLocale ( "en" ) ;
886+ await xcodeXcstringsLoader . pull ( "en" ) ;
887+
888+ await xcodeXcstringsLoader . push ( "ar" , payloadAr ) ;
889+
890+ expect ( fs . writeFile ) . toHaveBeenCalledWith ( "Localizable.xcstrings" , expectedOutput , {
891+ encoding : "utf-8" ,
892+ flag : "w" ,
893+ } ) ;
894+ } ) ;
760895 } ) ;
761896
762897 describe ( "yaml bucket loader" , ( ) => {
@@ -1007,10 +1142,7 @@ Bar`.trim();
10071142
10081143 await xmlLoader . push ( "es" , payload ) ;
10091144
1010- expect ( fs . writeFile ) . toHaveBeenCalledWith ( "i18n/es.xml" , expectedOutput , {
1011- encoding : "utf-8" ,
1012- flag : "w" ,
1013- } ) ;
1145+ expect ( fs . writeFile ) . toHaveBeenCalledWith ( "i18n/es.xml" , expectedOutput , { encoding : "utf-8" , flag : "w" } ) ;
10141146 } ) ;
10151147 } ) ;
10161148
0 commit comments