1
1
import test from 'ava' ;
2
- import { _add , _sub , _mul , _div } from '../../src' ;
2
+ import { _add , _sub , _mul , _div , _cmp } from '../../src' ;
3
3
4
4
import int from 'int' ;
5
5
import { ZZ } from '@aureooms/js-integer' ;
6
6
7
+ const GOOGOL = '10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' ;
8
+
7
9
function macro ( t , alu , [ [ _x , _y , _z , factory ] , a , b , c , d , e ] ) {
8
10
9
11
const apply = factory ( alu ) ;
@@ -18,7 +20,8 @@ function macro ( t , alu , [ [ _x , _y , _z , factory ] , a , b , c , d , e ] )
18
20
19
21
const z = apply ( a0 , a1 , b0 , b1 ) ;
20
22
21
- t . is ( num ( z ) , e ) ;
23
+ if ( Number . isInteger ( z ) ) t . is ( e , z ) ;
24
+ else t . is ( e , num ( z ) ) ;
22
25
23
26
}
24
27
@@ -28,13 +31,18 @@ macro.title = ( _ , alu , [ [ name , op , impl ] , a , b , c , d , e] ) => {
28
31
29
32
const ALU = [
30
33
{
31
- name : 'node- int based alu ' ,
34
+ name : 'int' ,
32
35
add : ( a , b ) => a . add ( b ) ,
33
36
sub : ( a , b ) => a . sub ( b ) ,
34
37
mul : ( a , b ) => a . mul ( b ) ,
35
38
div : ( a , b ) => a . div ( b ) ,
36
39
reg : x => int ( x ) ,
37
- str : x => x . toString ( )
40
+ str : x => x . toString ( ) ,
41
+ jz : x => x . eq ( 0 ) ,
42
+ lt0 : x => x . lt ( 0 ) ,
43
+ lt : ( a , b ) => a . lt ( b ) ,
44
+ neg : x => x . neg ( ) ,
45
+ divmod : ( a , b ) => [ a . div ( b ) , a . mod ( b ) ] ,
38
46
} ,
39
47
{
40
48
name : '@aureooms/js-integer' ,
@@ -43,15 +51,20 @@ const ALU = [
43
51
mul : ( a , b ) => a . mul ( b ) ,
44
52
div : ( a , b ) => a . div ( b ) ,
45
53
reg : x => ZZ . from ( x ) ,
46
- str : x => x . toString ( )
47
-
54
+ str : x => x . toString ( ) ,
55
+ jz : x => x . iszero ( ) ,
56
+ lt0 : x => x . sign ( ) < 0 ,
57
+ lt : ( a , b ) => a . lt ( b ) ,
58
+ neg : x => x . opposite ( ) ,
59
+ divmod : ( a , b ) => a . divmod ( b ) ,
48
60
}
49
61
] ;
50
62
51
63
const add = [ 'add' , '+' , '_add' , alu => _add ( alu . mul , alu . add ) ] ;
52
64
const sub = [ 'sub' , '-' , '_sub' , alu => _sub ( alu . mul , alu . sub ) ] ;
53
65
const mul = [ 'mul' , '*' , '_mul' , alu => _mul ( alu . mul ) ] ;
54
66
const div = [ 'div' , '/' , '_div' , alu => _div ( alu . mul ) ] ;
67
+ const cmp = [ 'cmp' , '~' , '_cmp' , alu => _cmp ( alu ) ] ;
55
68
56
69
const PARAMS = [
57
70
@@ -83,6 +96,41 @@ const PARAMS = [
83
96
[ div , '1' , '3' , '1' , '6' , 2 ] ,
84
97
[ div , '1' , '3' , '2' , '6' , 1 ] ,
85
98
99
+ [ cmp , '3' , '4' , '1' , '4' , 1 ] ,
100
+ [ cmp , '1' , '10' , '2' , '10' , - 1 ] ,
101
+ [ cmp , '5' , '10' , '2' , '10' , 1 ] ,
102
+ [ cmp , '18' , '10' , '2' , '10' , 1 ] ,
103
+ [ cmp , '1' , '3' , '1' , '6' , 1 ] ,
104
+ [ cmp , '1' , '3' , '2' , '6' , 0 ] ,
105
+ [ cmp , '6' , '7' , '13' , '14' , - 1 ] ,
106
+ [ cmp , '7' , '6' , '14' , '13' , 1 ] ,
107
+
108
+ [ cmp , '1' , '0' , '6' , '7' , 1 ] ,
109
+ [ cmp , '1' , '0' , '-6' , '7' , 1 ] ,
110
+ [ cmp , '-1' , '0' , '6' , '7' , - 1 ] ,
111
+ [ cmp , '-1' , '0' , '-6' , '7' , - 1 ] ,
112
+
113
+ [ cmp , '1' , '0' , '999999' , '1' , 1 ] ,
114
+ [ cmp , '1' , '0' , '-999999' , '1' , 1 ] ,
115
+ [ cmp , '-1' , '0' , '999999' , '1' , - 1 ] ,
116
+ [ cmp , '-1' , '0' , '-999999' , '1' , - 1 ] ,
117
+
118
+ [ cmp , '1' , '0' , '1' , '0' , 0 ] ,
119
+ [ cmp , '1' , '0' , '-1' , '0' , 1 ] ,
120
+ [ cmp , '-1' , '0' , '1' , '0' , - 1 ] ,
121
+ [ cmp , '-1' , '0' , '-1' , '0' , 0 ] ,
122
+
123
+ [ cmp , '1' , '0' , '999999' , '0' , 0 ] ,
124
+ [ cmp , '1' , '0' , '-999999' , '0' , 1 ] ,
125
+ [ cmp , '-1' , '0' , '999999' , '0' , - 1 ] ,
126
+ [ cmp , '-1' , '0' , '-999999' , '0' , 0 ] ,
127
+
128
+ [ cmp , GOOGOL , '7' , GOOGOL , '3' , - 1 ] ,
129
+ [ cmp , GOOGOL , '3' , GOOGOL , '7' , 1 ] ,
130
+ [ cmp , GOOGOL , '7' , GOOGOL , '7' , 0 ] ,
131
+ [ cmp , GOOGOL , '3' , GOOGOL , '3' , 0 ] ,
132
+ [ cmp , GOOGOL , GOOGOL , GOOGOL , GOOGOL , 0 ] ,
133
+
86
134
] ;
87
135
88
136
for ( const alu of ALU )
0 commit comments