@@ -752,3 +752,173 @@ describe('Coverwise class', () => {
752752 expect ( r1 . tests ) . toEqual ( r2 . tests ) ;
753753 } ) ;
754754} ) ;
755+
756+ describe ( 'Japanese and emoji support' , ( ) => {
757+ it ( 'generates with Japanese parameter names' , ( ) => {
758+ const result = generate ( {
759+ parameters : [
760+ { name : 'OS' , values : [ 'win' , 'mac' ] } ,
761+ { name : 'ブラウザ' , values : [ 'chrome' , 'firefox' ] } ,
762+ ] ,
763+ } ) ;
764+ expect ( result . coverage ) . toBe ( 1.0 ) ;
765+ expect ( result . tests . length ) . toBeGreaterThanOrEqual ( 2 ) ;
766+ for ( const tc of result . tests ) {
767+ expect ( tc ) . toHaveProperty ( 'ブラウザ' ) ;
768+ }
769+ } ) ;
770+
771+ it ( 'generates with Japanese values' , ( ) => {
772+ const result = generate ( {
773+ parameters : [
774+ { name : 'OS' , values : [ 'ウィンドウズ' , 'マック' ] } ,
775+ { name : 'ブラウザ' , values : [ 'クローム' , 'ファイアフォックス' ] } ,
776+ ] ,
777+ } ) ;
778+ expect ( result . coverage ) . toBe ( 1.0 ) ;
779+ for ( const tc of result . tests ) {
780+ expect ( [ 'ウィンドウズ' , 'マック' ] ) . toContain ( tc [ 'OS' ] ) ;
781+ expect ( [ 'クローム' , 'ファイアフォックス' ] ) . toContain ( tc [ 'ブラウザ' ] ) ;
782+ }
783+ } ) ;
784+
785+ it ( 'constraints with Japanese parameter names (unquoted)' , ( ) => {
786+ const result = generate ( {
787+ parameters : [
788+ { name : 'OS' , values : [ 'win' , 'mac' , 'linux' ] } ,
789+ { name : 'ブラウザ' , values : [ 'chrome' , 'safari' , 'edge' ] } ,
790+ ] ,
791+ constraints : [ 'IF OS = mac THEN ブラウザ != edge' ] ,
792+ } ) ;
793+ expect ( result . coverage ) . toBe ( 1.0 ) ;
794+ for ( const tc of result . tests ) {
795+ if ( tc [ 'OS' ] === 'mac' ) {
796+ expect ( tc [ 'ブラウザ' ] ) . not . toBe ( 'edge' ) ;
797+ }
798+ }
799+ } ) ;
800+
801+ it ( 'constraints with quoted values' , ( ) => {
802+ const result = generate ( {
803+ parameters : [
804+ { name : 'OS' , values : [ 'win' , 'mac' , 'linux' ] } ,
805+ { name : 'browser' , values : [ 'chrome' , 'safari' , 'edge' ] } ,
806+ ] ,
807+ constraints : [ 'IF OS = "mac" THEN browser != "edge"' ] ,
808+ } ) ;
809+ expect ( result . coverage ) . toBe ( 1.0 ) ;
810+ for ( const tc of result . tests ) {
811+ if ( tc [ 'OS' ] === 'mac' ) {
812+ expect ( tc [ 'browser' ] ) . not . toBe ( 'edge' ) ;
813+ }
814+ }
815+ } ) ;
816+
817+ it ( 'constraints with quoted Japanese values' , ( ) => {
818+ const result = generate ( {
819+ parameters : [
820+ { name : 'OS' , values : [ 'ウィンドウズ' , 'マック' , 'リナックス' ] } ,
821+ { name : 'ブラウザ' , values : [ 'クローム' , 'サファリ' , 'エッジ' ] } ,
822+ ] ,
823+ constraints : [ 'IF OS = "マック" THEN ブラウザ != "エッジ"' ] ,
824+ } ) ;
825+ expect ( result . coverage ) . toBe ( 1.0 ) ;
826+ for ( const tc of result . tests ) {
827+ if ( tc [ 'OS' ] === 'マック' ) {
828+ expect ( tc [ 'ブラウザ' ] ) . not . toBe ( 'エッジ' ) ;
829+ }
830+ }
831+ } ) ;
832+
833+ it ( 'constraints with values containing spaces (quoted)' , ( ) => {
834+ const result = generate ( {
835+ parameters : [
836+ { name : 'OS' , values : [ 'Windows 10' , 'macOS' , 'Ubuntu' ] } ,
837+ { name : 'browser' , values : [ 'chrome' , 'edge' ] } ,
838+ ] ,
839+ constraints : [ 'IF OS = "Windows 10" THEN browser != "edge"' ] ,
840+ } ) ;
841+ expect ( result . coverage ) . toBe ( 1.0 ) ;
842+ for ( const tc of result . tests ) {
843+ if ( tc [ 'OS' ] === 'Windows 10' ) {
844+ expect ( tc [ 'browser' ] ) . not . toBe ( 'edge' ) ;
845+ }
846+ }
847+ } ) ;
848+
849+ it ( 'generates with emoji parameter names and values' , ( ) => {
850+ const result = generate ( {
851+ parameters : [
852+ { name : '🖥️' , values : [ '💻' , '🖥️' ] } ,
853+ { name : '🌐' , values : [ '🔥' , '🧊' ] } ,
854+ ] ,
855+ } ) ;
856+ expect ( result . coverage ) . toBe ( 1.0 ) ;
857+ for ( const tc of result . tests ) {
858+ expect ( tc ) . toHaveProperty ( '🖥️' ) ;
859+ expect ( tc ) . toHaveProperty ( '🌐' ) ;
860+ }
861+ } ) ;
862+
863+ it ( 'analyzeCoverage with Japanese parameter names' , ( ) => {
864+ const params : Parameter [ ] = [
865+ { name : 'OS' , values : [ 'win' , 'mac' ] } ,
866+ { name : 'ブラウザ' , values : [ 'chrome' , 'firefox' ] } ,
867+ ] ;
868+ const tests : TestCase [ ] = [
869+ { OS : 'win' , ブラウザ : 'chrome' } ,
870+ { OS : 'win' , ブラウザ : 'firefox' } ,
871+ { OS : 'mac' , ブラウザ : 'chrome' } ,
872+ { OS : 'mac' , ブラウザ : 'firefox' } ,
873+ ] ;
874+ const report = analyzeCoverage ( params , tests , 2 ) ;
875+ expect ( report . coverageRatio ) . toBe ( 1.0 ) ;
876+ expect ( report . uncovered ) . toHaveLength ( 0 ) ;
877+ } ) ;
878+
879+ it ( 'analyzeCoverage with emoji keys' , ( ) => {
880+ const params : Parameter [ ] = [
881+ { name : '🎯' , values : [ 'hit' , 'miss' ] } ,
882+ { name : '🎲' , values : [ '1' , '2' ] } ,
883+ ] ;
884+ const tests : TestCase [ ] = [
885+ { '🎯' : 'hit' , '🎲' : '1' } ,
886+ { '🎯' : 'miss' , '🎲' : '2' } ,
887+ { '🎯' : 'hit' , '🎲' : '2' } ,
888+ { '🎯' : 'miss' , '🎲' : '1' } ,
889+ ] ;
890+ const report = analyzeCoverage ( params , tests , 2 ) ;
891+ expect ( report . coverageRatio ) . toBe ( 1.0 ) ;
892+ } ) ;
893+
894+ it ( 'extendTests with Japanese parameter names' , ( ) => {
895+ const input = {
896+ parameters : [
897+ { name : 'OS' , values : [ 'win' , 'mac' ] } ,
898+ { name : 'ブラウザ' , values : [ 'chrome' , 'firefox' ] } ,
899+ { name : '言語' , values : [ '日本語' , 'English' ] } ,
900+ ] ,
901+ seed : 1 ,
902+ } ;
903+ const existing : TestCase [ ] = [ { OS : 'win' , ブラウザ : 'chrome' , 言語 : '日本語' } ] ;
904+ const result = extendTests ( existing , input ) ;
905+ expect ( result . coverage ) . toBe ( 1.0 ) ;
906+ expect ( result . tests [ 0 ] ) . toEqual ( existing [ 0 ] ) ;
907+ } ) ;
908+
909+ it ( 'single-quoted values in constraints' , ( ) => {
910+ const result = generate ( {
911+ parameters : [
912+ { name : 'os' , values : [ 'win' , 'mac' ] } ,
913+ { name : 'browser' , values : [ 'chrome' , 'edge' ] } ,
914+ ] ,
915+ constraints : [ "IF os = 'mac' THEN browser != 'edge'" ] ,
916+ } ) ;
917+ expect ( result . coverage ) . toBe ( 1.0 ) ;
918+ for ( const tc of result . tests ) {
919+ if ( tc [ 'os' ] === 'mac' ) {
920+ expect ( tc [ 'browser' ] ) . not . toBe ( 'edge' ) ;
921+ }
922+ }
923+ } ) ;
924+ } ) ;
0 commit comments