11import operator
22
3- hugenumbers = [
4- 1 ,
5- 17 ,
3+ MAX_NUMBER = 2 ** 53 - 1
4+ MIN_NUMBER = - 2 ** 53
5+
6+ hugenumbers = sorted ([
67 91 ** 7 ,
78 2 ** 30 ,
89 3 ** 50
9- ]
10+ ])
1011
11- smallnumbers = [ 1 , 3 , 7 , 9 , 11 , 17 , 22 , 24 , 27 , 29 ]
12+ smallnumbers = sorted ( [ 1 , 3 , 7 , 9 , 11 , 17 , 22 , 24 , 27 , 29 , 1234 , 5678 ])
1213
1314arithmetic = {
1415 'add' : {
15- 'numbers' : hugenumbers ,
16+ 'numbers' : smallnumbers + hugenumbers ,
1617 'apply' : operator .add ,
1718 'str' : '+'
1819 } ,
1920 'sub' : {
20- 'numbers' : hugenumbers ,
21+ 'numbers' : smallnumbers + hugenumbers ,
2122 'apply' : operator .sub ,
2223 'str' : '-'
2324 } ,
2425 'mul' : {
25- 'numbers' : hugenumbers ,
26+ 'numbers' : smallnumbers + hugenumbers ,
2627 'apply' : operator .mul ,
2728 'str' : '*'
2829 } ,
3233 'str' : '^'
3334 } ,
3435 'div' : {
35- 'numbers' : hugenumbers ,
36+ 'numbers' : smallnumbers + hugenumbers ,
3637 'apply' : operator .floordiv ,
3738 'str' : '/'
3839 } ,
3940 'mod' : {
40- 'numbers' : hugenumbers ,
41+ 'numbers' : smallnumbers + hugenumbers ,
4142 'apply' : operator .mod ,
4243 'str' : '%'
4344 }
4445}
4546
46- def write ( f , numbers , name , t , opstr , a , ispow = True ) :
47+ def write ( f , numbers , name , t , ispow = False , isn = False , isi = False ) :
4748
4849 f .write ("import test from 'ava' ;\n " )
4950 f .write ("import {{ parse , stringify , {} }} from '../../../../src' ;\n \n " .format (name ))
5051
51- if ispow :
52+ if isn :
5253
5354 f .write ("""function macro ( t , A , B , C ) {{
5455 const a = parse( A ) ;
5556 const c = {}( a , B ) ;
5657 t.is( stringify( a ) , {} ) ;
5758 t.is( stringify( c ) , C ) ;
58- }}\n \n """ .format ( name , a ) )
59+ }}\n \n """ .format ( name , 'C' if isi else 'A' ) )
5960
6061 else :
6162
@@ -66,67 +67,62 @@ def write ( f , numbers , name , t , opstr , a , ispow = True ) :
6667 t.is( stringify( a ) , {} ) ;
6768 t.is( stringify( b ) , B ) ;
6869 t.is( stringify( c ) , C ) ;
69- }}\n \n """ .format ( name , a ) )
70+ }}\n \n """ .format ( name , 'C' if isi else 'A' ) )
71+
7072
73+ f .write ("macro.title = ( _ , A , B , C ) => `{}(${{A}},${{B}}) = ${{C}}` ;\n \n " .format (name ))
7174
72- f .write ("macro.title = ( _ , A , B , C ) => `${{A}} {} ${{B}} = ${{C}}` ;\n \n " .format (opstr ))
75+ if isn :
76+ LINE = "test( macro , '{}' , {} , '{}' ) ;\n "
77+ else :
78+ LINE = "test( macro , '{}' , '{}' , '{}' ) ;\n "
7379
7480 for a in numbers :
7581
7682 for b in numbers :
7783
78- if ispow :
84+ x = a
85+ y = b
86+ c = t ( x , y )
87+ if not isn or MIN_NUMBER <= y <= MAX_NUMBER :
88+ f .write (LINE .format (x ,y ,c ))
7989
80- x = a
81- y = b
82- c = t ( x , y )
83- f .write ("test( macro , '{}' , {} , '{}' ) ;\n " .format (x ,y ,c ))
90+ x = - a
91+ y = b
92+ c = t ( x , y )
93+ if not isn or MIN_NUMBER <= y <= MAX_NUMBER :
94+ f .write (LINE .format (x ,y ,c ))
8495
85- x = - a
86- y = b
87- c = t ( x , y )
88- f .write ("test( macro , '{}' , {} , '{}' ) ;\n " .format (x ,y ,c ))
89-
90- else :
91-
92- x = a
93- y = b
94- c = t ( x , y )
95- f .write ("test( macro , '{}' , '{}' , '{}' ) ;\n " .format (x ,y ,c ))
96-
97- x = - a
98- y = b
99- c = t ( x , y )
100- f .write ("test( macro , '{}' , '{}' , '{}' ) ;\n " .format (x ,y ,c ))
96+ if not ispow :
10197
10298 x = a
10399 y = - b
104100 c = t ( x , y )
105- f .write ("test( macro , '{}' , '{}' , '{}' ) ;\n " .format (x ,y ,c ))
101+ if not isn or MIN_NUMBER <= y <= MAX_NUMBER :
102+ f .write (LINE .format (x ,y ,c ))
106103
107104 x = - a
108105 y = - b
109106 c = t ( x , y )
110- f .write ("test( macro , '{}' , '{}' , '{}' ) ;\n " .format (x ,y ,c ))
107+ if not isn or MIN_NUMBER <= y <= MAX_NUMBER :
108+ f .write (LINE .format (x ,y ,c ))
109+
110+ def open_and_write ( opname , t , nb , ** kwargs ) :
111+ with open ( 'test/src/integer/arithmetic/{}.js' .format (opname ) , 'w' ) as f :
112+ write ( f , nb , opname , t , ** kwargs )
111113
112114for name , op in arithmetic .items ():
113115
114116 t = op ['apply' ]
115117 nb = op ['numbers' ]
116118
117- # standard op
118- with open ( 'test/src/integer/arithmetic/{}.js' .format (name ) , 'w' ) as f :
119-
120- opstr = op ['str' ]
121- a = 'A'
122-
123- write ( f , nb , name , t , opstr , a , ispow = name == 'pow' )
119+ ispow = name == 'pow'
124120
121+ # standard op
122+ open_and_write ( name , t , nb , ispow = ispow )
125123 # in-place op
126- iname = 'i{}' .format (name )
127- with open ( 'test/src/integer/arithmetic/{}.js' .format (iname ) , 'w' ) as f :
128-
129- opstr = op ['str' ] + '='
130- a = 'C'
131-
132- write ( f , nb , iname , t , opstr , a , ispow = name == 'pow' )
124+ open_and_write ( 'i' + name , t , nb , isi = True , ispow = ispow )
125+ # standard op with number arg
126+ open_and_write ( name + 'n' , t , nb , isn = True , ispow = ispow )
127+ # in-place op with number arg
128+ open_and_write ( 'i' + name + 'n' , t , nb , isi = True , isn = True , ispow = ispow )
0 commit comments