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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGES.md +25 -0
  4. data/README.md +104 -64
  5. data/extras/type_tests/%.rb +171 -0
  6. data/extras/type_tests/&.rb +159 -0
  7. data/extras/type_tests/**.rb +222 -0
  8. data/extras/type_tests/*.rb +177 -0
  9. data/extras/type_tests/+.rb +170 -0
  10. data/extras/type_tests/-.rb +171 -0
  11. data/extras/type_tests/1scomp.rb +157 -0
  12. data/extras/type_tests/<.rb +170 -0
  13. data/extras/type_tests/<<.rb +159 -0
  14. data/extras/type_tests/>>.rb +159 -0
  15. data/extras/type_tests/[].rb +163 -0
  16. data/extras/type_tests/^.rb +159 -0
  17. data/extras/type_tests/abs.rb +155 -0
  18. data/extras/type_tests/abs2.rb +164 -0
  19. data/extras/type_tests/angle.rb +157 -0
  20. data/extras/type_tests/arg.rb +157 -0
  21. data/extras/type_tests/bit_length.rb +157 -0
  22. data/extras/type_tests/ceil.rb +157 -0
  23. data/extras/type_tests/ceilRational.rb +160 -0
  24. data/extras/type_tests/conj.rb +158 -0
  25. data/extras/type_tests/defwhere.rb +86 -0
  26. data/extras/type_tests/denominator.rb +157 -0
  27. data/extras/type_tests/div.rb +172 -0
  28. data/extras/type_tests/divslash.rb +179 -0
  29. data/extras/type_tests/even?.rb +157 -0
  30. data/extras/type_tests/fdiv.rb +244 -0
  31. data/extras/type_tests/finite?.rb +157 -0
  32. data/extras/type_tests/floor.rb +157 -0
  33. data/extras/type_tests/floorRational.rb +161 -0
  34. data/extras/type_tests/hash.rb +157 -0
  35. data/extras/type_tests/imag.rb +158 -0
  36. data/extras/type_tests/infinite?.rb +157 -0
  37. data/extras/type_tests/modulo.rb +171 -0
  38. data/extras/type_tests/nan?.rb +157 -0
  39. data/extras/type_tests/neg.rb +155 -0
  40. data/extras/type_tests/next.rb +157 -0
  41. data/extras/type_tests/next_float.rb +157 -0
  42. data/extras/type_tests/numerator.rb +157 -0
  43. data/extras/type_tests/phase.rb +157 -0
  44. data/extras/type_tests/prev_float.rb +157 -0
  45. data/extras/type_tests/quo.rb +179 -0
  46. data/extras/type_tests/rationalize.rb +157 -0
  47. data/extras/type_tests/rationalizeArg.rb +198 -0
  48. data/extras/type_tests/real.rb +157 -0
  49. data/extras/type_tests/real?.rb +157 -0
  50. data/extras/type_tests/round.rb +157 -0
  51. data/extras/type_tests/roundArg.rb +169 -0
  52. data/extras/type_tests/size.rb +157 -0
  53. data/extras/type_tests/to_c.rb +157 -0
  54. data/extras/type_tests/to_f.rb +155 -0
  55. data/extras/type_tests/to_i.rb +157 -0
  56. data/extras/type_tests/to_r.rb +157 -0
  57. data/extras/type_tests/to_s.rb +157 -0
  58. data/extras/type_tests/truncate.rb +157 -0
  59. data/extras/type_tests/truncateArg.rb +166 -0
  60. data/extras/type_tests/type tests +1 -0
  61. data/extras/type_tests/zero?.rb +155 -0
  62. data/extras/type_tests/|.rb +159 -0
  63. data/lib/rdl/contracts/and.rb +1 -1
  64. data/lib/rdl/contracts/flat.rb +2 -2
  65. data/lib/rdl/contracts/proc.rb +2 -1
  66. data/lib/rdl/types/.#lexer.rex +1 -0
  67. data/lib/rdl/types/dependent_arg.rb +47 -0
  68. data/lib/rdl/types/finitehash.rb +5 -5
  69. data/lib/rdl/types/generic.rb +3 -3
  70. data/lib/rdl/types/lexer.rex +5 -2
  71. data/lib/rdl/types/lexer.rex.rb +3 -0
  72. data/lib/rdl/types/method.rb +144 -15
  73. data/lib/rdl/types/nominal.rb +1 -1
  74. data/lib/rdl/types/parser.racc +6 -1
  75. data/lib/rdl/types/parser.tab.rb +272 -245
  76. data/lib/rdl/types/tuple.rb +1 -1
  77. data/lib/rdl/types/type_inferencer.rb +7 -7
  78. data/lib/rdl/wrap.rb +16 -11
  79. data/rdl.gemspec +3 -3
  80. data/test/test_dsl.rb +4 -5
  81. data/test/test_le.rb +5 -5
  82. data/test/test_lib_types.rb +34 -34
  83. data/test/test_member.rb +3 -3
  84. data/test/test_type_contract.rb +63 -1
  85. data/test/test_types.rb +2 -0
  86. data/types/ruby-2.x/_aliases.rb +2 -2
  87. data/types/ruby-2.x/bigdecimal.rb +246 -12
  88. data/types/ruby-2.x/bignum.rb +253 -0
  89. data/types/ruby-2.x/complex.rb +111 -22
  90. data/types/ruby-2.x/fixnum.rb +238 -31
  91. data/types/ruby-2.x/float.rb +217 -35
  92. data/types/ruby-2.x/integer.rb +17 -16
  93. data/types/ruby-2.x/numeric.rb +31 -21
  94. data/types/ruby-2.x/rational.rb +196 -18
  95. metadata +67 -4
@@ -0,0 +1,244 @@
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
+ if type_one=="Float" && (x==Float::INFINITY || x.nan?)
14
+ y = gen_number3(0.3,0.3,0,0.05,0.05,0.1,0.1,0.1)
15
+ elsif type_one=="Rational"
16
+ y = gen_number2(0.3,0.3,0,0.05,0.05,0.1,0.1,0.1)
17
+ elsif type_one=="Complex"
18
+ if x.real.class==Float && (x.real==Float::INFINITY || x.real.nan?)
19
+ y = gen_number3(0.3,0.3,0,0.05,0.05,0.1,0.1,0.1)
20
+ elsif x.imaginary.class==Float && (x.imaginary==Float::INFINITY || x.imaginary.nan?)
21
+ y = gen_number3(0.3,0.3,0,0.05,0.05,0.1,0.1,0.1)
22
+ else
23
+ y = gen_number(0.2,0.2,0.1,0.05,0.05,0.2,0.1,0.1)
24
+ end
25
+ else
26
+ y = gen_number(0.2,0.2,0.1,0.05,0.05,0.2,0.1,0.1)
27
+ end
28
+ type_two = y.class.to_s
29
+ puts "Arg1= #{x} and type = #{type_one}"
30
+ puts "Arg2= #{y} and type = #{type_two}"
31
+ operation_type = query(type_one+'#fdiv',y)
32
+ expected_type = operation_type[operation_type.index('->')+3..-1]
33
+ w = x.fdiv(y)
34
+ puts "here"
35
+ test_result = w.is_a?(Object.const_get(expected_type))
36
+ if !test_result
37
+ puts "Arg1= #{x} (type: #{type_one})"
38
+ puts "Arg2= #{y} (type: #{type_two})"
39
+ puts "Res= #{w}"
40
+ puts "Expected type: #{expected_type}"
41
+ puts "Received type: #{w.class}"
42
+ end
43
+ #puts test_result
44
+ return test_result
45
+ end
46
+
47
+ def gen_fixnum()
48
+ return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
49
+ end
50
+
51
+ def gen_bignum()
52
+ r = Random.rand()
53
+ if r<0.5
54
+ return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
55
+ else
56
+ return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
57
+ end
58
+ end
59
+
60
+ def gen_float()
61
+ r = Random.rand()
62
+ if r<0.5
63
+ return Float::MAX*Random.rand
64
+ else
65
+ return -1*Float::MAX*Random.rand
66
+ end
67
+ end
68
+
69
+ def gen_bigdec()
70
+ r = Random.rand()
71
+ if r<0.33
72
+ return BigDecimal.new(gen_fixnum())
73
+ elsif r<0.66
74
+ return BigDecimal.new(gen_bignum())
75
+ else
76
+ return BigDecimal.new(gen_float(),0)
77
+ end
78
+ end
79
+
80
+ def gen_complex()
81
+ x = gen_number(0.25,0.25,0.1,0.05,0.05,0.2,0,0.1)
82
+ #puts x
83
+ if x.is_a?(BigDecimal)
84
+ y = gen_number(0.25,0.25,0.2,0,0,0.2,0,0.1)
85
+ elsif x.is_a?(Rational)
86
+ y = gen_number(0.25,0.25,0.1,0.05,0,0.25,0,0.1)
87
+ elsif x.is_a?(Float)&&(x==Float::INFINITY|| x.nan?)
88
+ y = gen_number(0.25,0.25,0,0.1,0.1,0.2,0,0.1)
89
+ else
90
+ y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
91
+ #puts y
92
+ end
93
+ return Complex(x,y)
94
+ end
95
+
96
+ def gen_complex2()
97
+ x = gen_number(0.25,0.25,0.2,0,0,0,0,0.3)
98
+ return Complex(x,0)
99
+ end
100
+
101
+ def gen_rational()
102
+ x = gen_fixnum()
103
+ y = gen_fixnum()
104
+ return Rational(x,y)
105
+ end
106
+
107
+ def gen_complex3()
108
+ x = gen_number(0.25,0.25,0,0.05,0.05,0.3,0,0.1)
109
+ y = gen_number(0.25,0.25,0,0.05,0.05,0.3,0,0.1)
110
+ #puts y
111
+ return Complex(x,y)
112
+ end
113
+
114
+
115
+ def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
116
+ r = Random.rand()
117
+ if r<probFixnum then
118
+ #Fixnum type
119
+ x = gen_fixnum()
120
+ elsif r<(probFixnum+probBignum)
121
+ x = gen_bignum()
122
+ elsif r<(probFixnum+probBignum+probBigDec)
123
+ #BigDecimal type
124
+ x = gen_bigdec()
125
+ elsif r<(probFixnum+probBignum+probBigDec+probInf)
126
+ x=Float::INFINITY
127
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
128
+ x=Float::NAN
129
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
130
+ #Random Float type
131
+ x = gen_float()
132
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
133
+ x= gen_complex()
134
+ elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
135
+ x = gen_rational()
136
+ end
137
+ return x
138
+ end
139
+
140
+ def gen_number2(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
141
+ r = Random.rand()
142
+ if r<probFixnum then
143
+ #Fixnum type
144
+ x = gen_fixnum()
145
+ elsif r<(probFixnum+probBignum)
146
+ x = gen_bignum()
147
+ elsif r<(probFixnum+probBignum+probBigDec)
148
+ #BigDecimal type
149
+ x = gen_bigdec()
150
+ elsif r<(probFixnum+probBignum+probBigDec+probInf)
151
+ x=Float::INFINITY
152
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
153
+ x=Float::NAN
154
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
155
+ #Random Float type
156
+ x = gen_float()
157
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
158
+ x= gen_complex2()
159
+ elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
160
+ x = gen_rational()
161
+ end
162
+ return x
163
+ end
164
+
165
+ def gen_number3(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
166
+ r = Random.rand()
167
+ if r<probFixnum then
168
+ #Fixnum type
169
+ x = gen_fixnum()
170
+ elsif r<(probFixnum+probBignum)
171
+ x = gen_bignum()
172
+ elsif r<(probFixnum+probBignum+probBigDec)
173
+ #BigDecimal type
174
+ x = gen_bigdec()
175
+ elsif r<(probFixnum+probBignum+probBigDec+probInf)
176
+ x=Float::INFINITY
177
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
178
+ x=Float::NAN
179
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
180
+ #Random Float type
181
+ x = gen_float()
182
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
183
+ x= gen_complex3()
184
+ elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
185
+ x = gen_rational()
186
+ end
187
+ return x
188
+ end
189
+
190
+ def rounds(x)
191
+ counter = 0
192
+ for i in 0..x
193
+ b= test()
194
+ if (!b) then
195
+ counter=counter+1
196
+ end
197
+
198
+ end
199
+ return counter
200
+ end
201
+
202
+
203
+ def query(q,y)
204
+ $__rdl_contract_switch.off {
205
+ if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
206
+ klass = nil
207
+ klass_pref = nil
208
+ meth = nil
209
+ if q =~ /(.+)#(.+)/
210
+ klass = $1
211
+ klass_pref = "#{klass}#"
212
+ meth = $2.to_sym
213
+ elsif q =~ /(.+)\.(.+)/
214
+ klass_pref = "#{$1}."
215
+ klass = RDL::Util.add_singleton_marker($1)
216
+ meth = $2.to_sym
217
+ else
218
+ klass = self.class.to_s
219
+ klass_pref = "#{klass}#"
220
+ meth = q.to_sym
221
+ end
222
+ if RDL::Wrap.has_contracts?(klass, meth, :type)
223
+ typs = RDL::Wrap.get_contracts(klass, meth, :type)
224
+ typs.each { |t|
225
+ #puts "#{klass_pref}#{meth}: #{t}"
226
+ t_string = "#{t}"
227
+ t_string =~ /\((\w*)\)(.+)/
228
+
229
+ #puts y
230
+ if y.is_a?(Object.const_get($1))
231
+ return t_string
232
+ end
233
+ #return "#{t}"
234
+ }
235
+ nil
236
+ else
237
+ #puts "No type for #{klass_pref}#{meth}"
238
+ end
239
+ else
240
+ #puts "Not implemented"
241
+ end
242
+ }
243
+ end
244
+
@@ -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,0,0.5,0.05,0.05,0.4,0,0)
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+'#finite?',nil)
16
+ expected_type = operation_type[operation_type.index('->')+3..-1]
17
+ w = x.finite?
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.2,0,0,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
+
@@ -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.2,0,0,0.2,0,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+'#floor',nil)
16
+ expected_type = operation_type[operation_type.index('->')+3..-1]
17
+ w = x.floor
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
+