rdl 1.1.0 → 1.1.1.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGES.md +25 -0
- data/README.md +104 -64
- data/extras/type_tests/%.rb +171 -0
- data/extras/type_tests/&.rb +159 -0
- data/extras/type_tests/**.rb +222 -0
- data/extras/type_tests/*.rb +177 -0
- data/extras/type_tests/+.rb +170 -0
- data/extras/type_tests/-.rb +171 -0
- data/extras/type_tests/1scomp.rb +157 -0
- data/extras/type_tests/<.rb +170 -0
- data/extras/type_tests/<<.rb +159 -0
- data/extras/type_tests/>>.rb +159 -0
- data/extras/type_tests/[].rb +163 -0
- data/extras/type_tests/^.rb +159 -0
- data/extras/type_tests/abs.rb +155 -0
- data/extras/type_tests/abs2.rb +164 -0
- data/extras/type_tests/angle.rb +157 -0
- data/extras/type_tests/arg.rb +157 -0
- data/extras/type_tests/bit_length.rb +157 -0
- data/extras/type_tests/ceil.rb +157 -0
- data/extras/type_tests/ceilRational.rb +160 -0
- data/extras/type_tests/conj.rb +158 -0
- data/extras/type_tests/defwhere.rb +86 -0
- data/extras/type_tests/denominator.rb +157 -0
- data/extras/type_tests/div.rb +172 -0
- data/extras/type_tests/divslash.rb +179 -0
- data/extras/type_tests/even?.rb +157 -0
- data/extras/type_tests/fdiv.rb +244 -0
- data/extras/type_tests/finite?.rb +157 -0
- data/extras/type_tests/floor.rb +157 -0
- data/extras/type_tests/floorRational.rb +161 -0
- data/extras/type_tests/hash.rb +157 -0
- data/extras/type_tests/imag.rb +158 -0
- data/extras/type_tests/infinite?.rb +157 -0
- data/extras/type_tests/modulo.rb +171 -0
- data/extras/type_tests/nan?.rb +157 -0
- data/extras/type_tests/neg.rb +155 -0
- data/extras/type_tests/next.rb +157 -0
- data/extras/type_tests/next_float.rb +157 -0
- data/extras/type_tests/numerator.rb +157 -0
- data/extras/type_tests/phase.rb +157 -0
- data/extras/type_tests/prev_float.rb +157 -0
- data/extras/type_tests/quo.rb +179 -0
- data/extras/type_tests/rationalize.rb +157 -0
- data/extras/type_tests/rationalizeArg.rb +198 -0
- data/extras/type_tests/real.rb +157 -0
- data/extras/type_tests/real?.rb +157 -0
- data/extras/type_tests/round.rb +157 -0
- data/extras/type_tests/roundArg.rb +169 -0
- data/extras/type_tests/size.rb +157 -0
- data/extras/type_tests/to_c.rb +157 -0
- data/extras/type_tests/to_f.rb +155 -0
- data/extras/type_tests/to_i.rb +157 -0
- data/extras/type_tests/to_r.rb +157 -0
- data/extras/type_tests/to_s.rb +157 -0
- data/extras/type_tests/truncate.rb +157 -0
- data/extras/type_tests/truncateArg.rb +166 -0
- data/extras/type_tests/type tests +1 -0
- data/extras/type_tests/zero?.rb +155 -0
- data/extras/type_tests/|.rb +159 -0
- data/lib/rdl/contracts/and.rb +1 -1
- data/lib/rdl/contracts/flat.rb +2 -2
- data/lib/rdl/contracts/proc.rb +2 -1
- data/lib/rdl/types/.#lexer.rex +1 -0
- data/lib/rdl/types/dependent_arg.rb +47 -0
- data/lib/rdl/types/finitehash.rb +5 -5
- data/lib/rdl/types/generic.rb +3 -3
- data/lib/rdl/types/lexer.rex +5 -2
- data/lib/rdl/types/lexer.rex.rb +3 -0
- data/lib/rdl/types/method.rb +144 -15
- data/lib/rdl/types/nominal.rb +1 -1
- data/lib/rdl/types/parser.racc +6 -1
- data/lib/rdl/types/parser.tab.rb +272 -245
- data/lib/rdl/types/tuple.rb +1 -1
- data/lib/rdl/types/type_inferencer.rb +7 -7
- data/lib/rdl/wrap.rb +16 -11
- data/rdl.gemspec +3 -3
- data/test/test_dsl.rb +4 -5
- data/test/test_le.rb +5 -5
- data/test/test_lib_types.rb +34 -34
- data/test/test_member.rb +3 -3
- data/test/test_type_contract.rb +63 -1
- data/test/test_types.rb +2 -0
- data/types/ruby-2.x/_aliases.rb +2 -2
- data/types/ruby-2.x/bigdecimal.rb +246 -12
- data/types/ruby-2.x/bignum.rb +253 -0
- data/types/ruby-2.x/complex.rb +111 -22
- data/types/ruby-2.x/fixnum.rb +238 -31
- data/types/ruby-2.x/float.rb +217 -35
- data/types/ruby-2.x/integer.rb +17 -16
- data/types/ruby-2.x/numeric.rb +31 -21
- data/types/ruby-2.x/rational.rb +196 -18
- metadata +67 -4
@@ -0,0 +1,160 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
require 'rdl'
|
5
|
+
require 'rdl_types'
|
6
|
+
|
7
|
+
MAX_FIXNUM = 2**(0.size*8-2)-1 #Largest fixnum. -2 since 1 bit used for sign, 1 bit used as int marker.
|
8
|
+
MIN_FIXNUM = -(2**(0.size*8-2)) #Smallest fixnum.
|
9
|
+
|
10
|
+
def test()
|
11
|
+
x = gen_number(0,0,0,0,0,0,0,1)
|
12
|
+
type_one = x.class.to_s
|
13
|
+
y = gen_number(0.5,0.5,0,0,0,0,0,0)
|
14
|
+
type_two = y.class.to_s
|
15
|
+
#puts "Arg1= #{x} and type = #{type_one}"
|
16
|
+
#puts "Arg2= #{y} and type = #{type_two}"
|
17
|
+
operation_type = query(type_one+'#ceil',y)
|
18
|
+
expected_type = operation_type[operation_type.index('->')+3..-1]
|
19
|
+
w = x.ceil(y)
|
20
|
+
test_result = w.is_a?(Object.const_get(expected_type))
|
21
|
+
if !test_result
|
22
|
+
puts "Arg1= #{x} (type: #{type_one})"
|
23
|
+
puts "Arg2= #{y} (type: #{type_two})"
|
24
|
+
puts "Res= #{w}"
|
25
|
+
puts "Expected type: #{expected_type}"
|
26
|
+
puts "Received type: #{w.class}"
|
27
|
+
end
|
28
|
+
#puts test_result
|
29
|
+
return test_result
|
30
|
+
end
|
31
|
+
|
32
|
+
def gen_fixnum()
|
33
|
+
return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
|
34
|
+
end
|
35
|
+
|
36
|
+
def gen_bignum()
|
37
|
+
r = Random.rand()
|
38
|
+
if r<0.5
|
39
|
+
return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
40
|
+
else
|
41
|
+
return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def gen_float()
|
46
|
+
r = Random.rand()
|
47
|
+
if r<0.5
|
48
|
+
return Float::MAX*Random.rand
|
49
|
+
else
|
50
|
+
return -1*Float::MAX*Random.rand
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def gen_bigdec()
|
55
|
+
r = Random.rand()
|
56
|
+
if r<0.33
|
57
|
+
return BigDecimal.new(gen_fixnum())
|
58
|
+
elsif r<0.66
|
59
|
+
return BigDecimal.new(gen_bignum())
|
60
|
+
else
|
61
|
+
return BigDecimal.new(gen_float(),0)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def gen_complex()
|
66
|
+
x = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
|
67
|
+
#puts x
|
68
|
+
y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
|
69
|
+
#puts y
|
70
|
+
return Complex(x,y)
|
71
|
+
end
|
72
|
+
|
73
|
+
def gen_rational()
|
74
|
+
x = gen_fixnum()
|
75
|
+
y = gen_fixnum()
|
76
|
+
return Rational(x,y)
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
|
81
|
+
r = Random.rand()
|
82
|
+
if r<probFixnum then
|
83
|
+
#Fixnum type
|
84
|
+
x = gen_fixnum()
|
85
|
+
elsif r<(probFixnum+probBignum)
|
86
|
+
x = gen_bignum()
|
87
|
+
elsif r<(probFixnum+probBignum+probBigDec)
|
88
|
+
#BigDecimal type
|
89
|
+
x = gen_bigdec()
|
90
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf)
|
91
|
+
x=Float::INFINITY
|
92
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
|
93
|
+
x=Float::NAN
|
94
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
|
95
|
+
#Random Float type
|
96
|
+
x = gen_float()
|
97
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
|
98
|
+
x= gen_complex()
|
99
|
+
elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
|
100
|
+
x = gen_rational()
|
101
|
+
end
|
102
|
+
return x
|
103
|
+
end
|
104
|
+
|
105
|
+
def rounds(x)
|
106
|
+
counter = 0
|
107
|
+
for i in 0..x
|
108
|
+
b= test()
|
109
|
+
if (!b) then
|
110
|
+
counter=counter+1
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
return counter
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def query(q,y)
|
119
|
+
$__rdl_contract_switch.off {
|
120
|
+
if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
|
121
|
+
klass = nil
|
122
|
+
klass_pref = nil
|
123
|
+
meth = nil
|
124
|
+
if q =~ /(.+)#(.+)/
|
125
|
+
klass = $1
|
126
|
+
klass_pref = "#{klass}#"
|
127
|
+
meth = $2.to_sym
|
128
|
+
elsif q =~ /(.+)\.(.+)/
|
129
|
+
klass_pref = "#{$1}."
|
130
|
+
klass = RDL::Util.add_singleton_marker($1)
|
131
|
+
meth = $2.to_sym
|
132
|
+
else
|
133
|
+
klass = self.class.to_s
|
134
|
+
klass_pref = "#{klass}#"
|
135
|
+
meth = q.to_sym
|
136
|
+
end
|
137
|
+
if RDL::Wrap.has_contracts?(klass, meth, :type)
|
138
|
+
typs = RDL::Wrap.get_contracts(klass, meth, :type)
|
139
|
+
typs.each { |t|
|
140
|
+
#puts "#{klass_pref}#{meth}: #{t}"
|
141
|
+
t_string = "#{t}"
|
142
|
+
t_string =~ /\((\w*)\)(.+)/
|
143
|
+
if $1!=""
|
144
|
+
#catch negative sign case
|
145
|
+
if y.is_a?(Object.const_get($1))
|
146
|
+
return t_string
|
147
|
+
end
|
148
|
+
end
|
149
|
+
#return "#{t}"
|
150
|
+
}
|
151
|
+
|
152
|
+
else
|
153
|
+
#puts "No type for #{klass_pref}#{meth}"
|
154
|
+
end
|
155
|
+
else
|
156
|
+
#puts "Not implemented"
|
157
|
+
end
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
@@ -0,0 +1,158 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
require 'rdl'
|
5
|
+
require 'rdl_types'
|
6
|
+
|
7
|
+
MAX_FIXNUM = 2**(0.size*8-2)-1 #Largest fixnum. -2 since 1 bit used for sign, 1 bit used as int marker.
|
8
|
+
MIN_FIXNUM = -(2**(0.size*8-2)) #Smallest fixnum.
|
9
|
+
|
10
|
+
def test()
|
11
|
+
x = gen_number(0.2,0.2,0.1,0.05,0.05,0.2,0.1,0.1)
|
12
|
+
type_one = x.class.to_s
|
13
|
+
puts "Arg1= #{x} and type = #{type_one}"
|
14
|
+
operation_type = query(type_one+'#conj',nil)
|
15
|
+
expected_type = operation_type[operation_type.index('->')+3..-1]
|
16
|
+
w = x.conj
|
17
|
+
puts "here"
|
18
|
+
#puts expected_type
|
19
|
+
test_result = w.is_a?(Object.const_get(expected_type))
|
20
|
+
#puts "here2"
|
21
|
+
if !test_result
|
22
|
+
puts "Arg1= #{x} (type: #{type_one})"
|
23
|
+
puts "Arg2= #{y} (type: #{type_two})"
|
24
|
+
puts "Res= #{w}"
|
25
|
+
puts "Expected type: #{expected_type}"
|
26
|
+
puts "Received type: #{w.class}"
|
27
|
+
end
|
28
|
+
#puts test_result
|
29
|
+
return test_result
|
30
|
+
end
|
31
|
+
|
32
|
+
def gen_fixnum()
|
33
|
+
return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
|
34
|
+
end
|
35
|
+
|
36
|
+
def gen_bignum()
|
37
|
+
r = Random.rand()
|
38
|
+
if r<0.5
|
39
|
+
return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
40
|
+
else
|
41
|
+
return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def gen_float()
|
46
|
+
r = Random.rand()
|
47
|
+
if r<0.5
|
48
|
+
return Float::MAX*Random.rand
|
49
|
+
else
|
50
|
+
return -1*Float::MAX*Random.rand
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def gen_bigdec()
|
55
|
+
r = Random.rand()
|
56
|
+
if r<0.33
|
57
|
+
return BigDecimal.new(gen_fixnum())
|
58
|
+
elsif r<0.66
|
59
|
+
return BigDecimal.new(gen_bignum())
|
60
|
+
else
|
61
|
+
return BigDecimal.new(gen_float(),0)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def gen_complex()
|
66
|
+
x = gen_number(0.25,0.25,0.1,0.05,0.05,0.2,0,0.1)
|
67
|
+
#puts x
|
68
|
+
y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
|
69
|
+
#puts y
|
70
|
+
return Complex(x,y)
|
71
|
+
end
|
72
|
+
|
73
|
+
def gen_rational()
|
74
|
+
x = gen_fixnum()
|
75
|
+
y = gen_fixnum()
|
76
|
+
return Rational(x,y)
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
|
81
|
+
r = Random.rand()
|
82
|
+
if r<probFixnum then
|
83
|
+
#Fixnum type
|
84
|
+
x = gen_fixnum()
|
85
|
+
elsif r<(probFixnum+probBignum)
|
86
|
+
x = gen_bignum()
|
87
|
+
elsif r<(probFixnum+probBignum+probBigDec)
|
88
|
+
#BigDecimal type
|
89
|
+
x = gen_bigdec()
|
90
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf)
|
91
|
+
x=Float::INFINITY
|
92
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
|
93
|
+
x=Float::NAN
|
94
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
|
95
|
+
#Random Float type
|
96
|
+
x = gen_float()
|
97
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
|
98
|
+
x= gen_complex()
|
99
|
+
elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
|
100
|
+
x = gen_rational()
|
101
|
+
end
|
102
|
+
return x
|
103
|
+
end
|
104
|
+
|
105
|
+
def rounds(x)
|
106
|
+
counter = 0
|
107
|
+
for i in 0..x
|
108
|
+
b= test()
|
109
|
+
if (!b) then
|
110
|
+
counter=counter+1
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
return counter
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def query(q,y)
|
119
|
+
$__rdl_contract_switch.off {
|
120
|
+
if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
|
121
|
+
klass = nil
|
122
|
+
klass_pref = nil
|
123
|
+
meth = nil
|
124
|
+
if q =~ /(.+)#(.+)/
|
125
|
+
klass = $1
|
126
|
+
klass_pref = "#{klass}#"
|
127
|
+
meth = $2.to_sym
|
128
|
+
elsif q =~ /(.+)\.(.+)/
|
129
|
+
klass_pref = "#{$1}."
|
130
|
+
klass = RDL::Util.add_singleton_marker($1)
|
131
|
+
meth = $2.to_sym
|
132
|
+
else
|
133
|
+
klass = self.class.to_s
|
134
|
+
klass_pref = "#{klass}#"
|
135
|
+
meth = q.to_sym
|
136
|
+
end
|
137
|
+
if RDL::Wrap.has_contracts?(klass, meth, :type)
|
138
|
+
typs = RDL::Wrap.get_contracts(klass, meth, :type)
|
139
|
+
typs.each { |t|
|
140
|
+
#puts "#{klass_pref}#{meth}: #{t}"
|
141
|
+
t_string = "#{t}"
|
142
|
+
#puts t_string
|
143
|
+
t_string =~ /\((\w*)\)(.+)/
|
144
|
+
if $1==""
|
145
|
+
return t_string
|
146
|
+
end
|
147
|
+
#return "#{t}"
|
148
|
+
}
|
149
|
+
|
150
|
+
else
|
151
|
+
#puts "No type for #{klass_pref}#{meth}"
|
152
|
+
end
|
153
|
+
else
|
154
|
+
#puts "Not implemented"
|
155
|
+
end
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rdl'
|
4
|
+
require 'rdl_types'
|
5
|
+
|
6
|
+
#array = Fixnum.instance_methods(false)
|
7
|
+
|
8
|
+
def check_one(cl) #checks class for missing methods
|
9
|
+
array_one = cl.instance_methods(false)
|
10
|
+
array_one.each{ |t|
|
11
|
+
if query(cl.to_s+'#'+t.to_s)==nil
|
12
|
+
puts t end}
|
13
|
+
end
|
14
|
+
|
15
|
+
def check_two(cl) #checks class for methods which are actually inherited
|
16
|
+
array_one = cl.instance_methods(false)
|
17
|
+
array_two = class_query(cl)
|
18
|
+
array_two.each{ |t|
|
19
|
+
if !array_one.include?(t) then puts t end}
|
20
|
+
end
|
21
|
+
|
22
|
+
def class_query(q)
|
23
|
+
klass = q.to_s
|
24
|
+
return nil unless $__rdl_contracts.has_key? klass
|
25
|
+
cls_meths = []
|
26
|
+
cls_klass = RDL::Util.add_singleton_marker(klass)
|
27
|
+
if $__rdl_contracts.has_key? cls_klass then
|
28
|
+
$__rdl_contracts[cls_klass].each { |meth, kinds|
|
29
|
+
if kinds.has_key? :type then
|
30
|
+
kinds[:type].each { |t| cls_meths << meth }
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
inst_meths = []
|
35
|
+
if $__rdl_contracts.has_key? klass then
|
36
|
+
$__rdl_contracts[klass].each { |meth, kinds|
|
37
|
+
if kinds.has_key? :type then
|
38
|
+
kinds[:type].each { |t| inst_meths << meth }
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
cls_meths.sort! { |p1, p2| p1[0] <=> p2[0] }
|
43
|
+
cls_meths.each { |m, t| m.insert(0, "self.") }
|
44
|
+
inst_meths.sort! { |p1, p2| p1[0] <=> p2[0] }
|
45
|
+
return cls_meths + inst_meths
|
46
|
+
end
|
47
|
+
|
48
|
+
def query(q)
|
49
|
+
$__rdl_contract_switch.off {
|
50
|
+
if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
|
51
|
+
klass = nil
|
52
|
+
klass_pref = nil
|
53
|
+
meth = nil
|
54
|
+
if q =~ /(.+)#(.+)/
|
55
|
+
klass = $1
|
56
|
+
klass_pref = "#{klass}#"
|
57
|
+
meth = $2.to_sym
|
58
|
+
elsif q =~ /(.+)\.(.+)/
|
59
|
+
klass_pref = "#{$1}."
|
60
|
+
klass = RDL::Util.add_singleton_marker($1)
|
61
|
+
meth = $2.to_sym
|
62
|
+
else
|
63
|
+
klass = self.class.to_s
|
64
|
+
klass_pref = "#{klass}#"
|
65
|
+
meth = q.to_sym
|
66
|
+
end
|
67
|
+
if RDL::Wrap.has_contracts?(klass, meth, :type)
|
68
|
+
typs = RDL::Wrap.get_contracts(klass, meth, :type)
|
69
|
+
typs.each { |t|
|
70
|
+
#puts "#{klass_pref}#{meth}: #{t}"
|
71
|
+
t_string = "#{t}"
|
72
|
+
t_string =~ /\((\w*)\)(.+)/
|
73
|
+
|
74
|
+
#puts y
|
75
|
+
return t_string
|
76
|
+
#return "#{t}"
|
77
|
+
}
|
78
|
+
nil
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
else
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
}
|
86
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bigdecimal'
|
4
|
+
require 'rdl'
|
5
|
+
require 'rdl_types'
|
6
|
+
|
7
|
+
MAX_FIXNUM = 2**(0.size*8-2)-1 #Largest fixnum. -2 since 1 bit used for sign, 1 bit used as int marker.
|
8
|
+
MIN_FIXNUM = -(2**(0.size*8-2)) #Smallest fixnum.
|
9
|
+
|
10
|
+
def test()
|
11
|
+
x = gen_number(0.2,0.2,0.1,0,0,0.2,0.1,0.2)
|
12
|
+
type_one = x.class.to_s
|
13
|
+
#puts "Arg1= #{x} and type = #{type_one}"
|
14
|
+
#puts "Arg2= #{y} and type = #{type_two}"
|
15
|
+
operation_type = query(type_one+'#denominator',nil)
|
16
|
+
expected_type = operation_type[operation_type.index('->')+3..-1]
|
17
|
+
w = x.denominator
|
18
|
+
#puts "here1"
|
19
|
+
test_result = w.is_a?(Object.const_get(expected_type))
|
20
|
+
if !test_result
|
21
|
+
puts "Arg1= #{x} (type: #{type_one})"
|
22
|
+
#puts "Arg2= #{y} (type: #{type_two})"
|
23
|
+
puts "Res= #{w}"
|
24
|
+
puts "Expected type: #{expected_type}"
|
25
|
+
puts "Received type: #{w.class}"
|
26
|
+
end
|
27
|
+
#puts test_result
|
28
|
+
return test_result
|
29
|
+
end
|
30
|
+
|
31
|
+
def gen_fixnum()
|
32
|
+
return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
|
33
|
+
end
|
34
|
+
|
35
|
+
def gen_bignum()
|
36
|
+
r = Random.rand()
|
37
|
+
if r<0.5
|
38
|
+
return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
39
|
+
else
|
40
|
+
return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def gen_float()
|
45
|
+
r = Random.rand()
|
46
|
+
if r<0.5
|
47
|
+
return Float::MAX*Random.rand
|
48
|
+
else
|
49
|
+
return -1*Float::MAX*Random.rand
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def gen_bigdec()
|
54
|
+
r = Random.rand()
|
55
|
+
if r<0.33
|
56
|
+
return BigDecimal.new(gen_fixnum())
|
57
|
+
elsif r<0.66
|
58
|
+
return BigDecimal.new(gen_bignum())
|
59
|
+
else
|
60
|
+
return BigDecimal.new(gen_float(),0)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def gen_complex()
|
65
|
+
x = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
|
66
|
+
#puts x
|
67
|
+
y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
|
68
|
+
#puts y
|
69
|
+
return Complex(x,y)
|
70
|
+
end
|
71
|
+
|
72
|
+
def gen_rational()
|
73
|
+
x = gen_fixnum()
|
74
|
+
y = gen_fixnum()
|
75
|
+
return Rational(x,y)
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
|
80
|
+
r = Random.rand()
|
81
|
+
if r<probFixnum then
|
82
|
+
#Fixnum type
|
83
|
+
x = gen_fixnum()
|
84
|
+
elsif r<(probFixnum+probBignum)
|
85
|
+
x = gen_bignum()
|
86
|
+
elsif r<(probFixnum+probBignum+probBigDec)
|
87
|
+
#BigDecimal type
|
88
|
+
x = gen_bigdec()
|
89
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf)
|
90
|
+
x=Float::INFINITY
|
91
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
|
92
|
+
x=Float::NAN
|
93
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
|
94
|
+
#Random Float type
|
95
|
+
x = gen_float()
|
96
|
+
elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
|
97
|
+
x= gen_complex()
|
98
|
+
elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
|
99
|
+
x = gen_rational()
|
100
|
+
end
|
101
|
+
return x
|
102
|
+
end
|
103
|
+
|
104
|
+
def rounds(x)
|
105
|
+
counter = 0
|
106
|
+
for i in 0..x
|
107
|
+
b= test()
|
108
|
+
if (!b) then
|
109
|
+
counter=counter+1
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
return counter
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
def query(q,y)
|
118
|
+
$__rdl_contract_switch.off {
|
119
|
+
if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
|
120
|
+
klass = nil
|
121
|
+
klass_pref = nil
|
122
|
+
meth = nil
|
123
|
+
if q =~ /(.+)#(.+)/
|
124
|
+
klass = $1
|
125
|
+
klass_pref = "#{klass}#"
|
126
|
+
meth = $2.to_sym
|
127
|
+
elsif q =~ /(.+)\.(.+)/
|
128
|
+
klass_pref = "#{$1}."
|
129
|
+
klass = RDL::Util.add_singleton_marker($1)
|
130
|
+
meth = $2.to_sym
|
131
|
+
else
|
132
|
+
klass = self.class.to_s
|
133
|
+
klass_pref = "#{klass}#"
|
134
|
+
meth = q.to_sym
|
135
|
+
end
|
136
|
+
if RDL::Wrap.has_contracts?(klass, meth, :type)
|
137
|
+
typs = RDL::Wrap.get_contracts(klass, meth, :type)
|
138
|
+
typs.each { |t|
|
139
|
+
#puts "#{klass_pref}#{meth}: #{t}"
|
140
|
+
t_string = "#{t}"
|
141
|
+
#puts t_string
|
142
|
+
t_string =~ /\((\w*)\)(.+)/
|
143
|
+
if $1==""
|
144
|
+
return t_string
|
145
|
+
end
|
146
|
+
#return "#{t}"
|
147
|
+
}
|
148
|
+
|
149
|
+
else
|
150
|
+
#puts "No type for #{klass_pref}#{meth}"
|
151
|
+
end
|
152
|
+
else
|
153
|
+
#puts "Not implemented"
|
154
|
+
end
|
155
|
+
}
|
156
|
+
end
|
157
|
+
|