rdl 2.0.1 → 2.1.0

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 (252) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -0
  3. data/CHANGES.md +35 -0
  4. data/README.md +153 -116
  5. data/bin/rdl_query +1 -1
  6. data/extras/type_tests/typetests.rb +905 -0
  7. data/lib/rdl.rb +0 -1
  8. data/lib/rdl/boot.rb +108 -77
  9. data/lib/rdl/boot_rails.rb +2 -8
  10. data/lib/rdl/config.rb +44 -17
  11. data/lib/rdl/contracts/flat.rb +1 -1
  12. data/lib/rdl/info.rb +3 -3
  13. data/lib/rdl/query.rb +11 -11
  14. data/lib/rdl/typecheck.rb +399 -136
  15. data/lib/rdl/types/finite_hash.rb +3 -2
  16. data/lib/rdl/types/generic.rb +7 -6
  17. data/lib/rdl/types/intersection.rb +3 -2
  18. data/lib/rdl/types/lexer.rex +2 -3
  19. data/lib/rdl/types/lexer.rex.rb +1 -4
  20. data/lib/rdl/types/method.rb +7 -6
  21. data/lib/rdl/types/nominal.rb +10 -1
  22. data/lib/rdl/types/parser.racc +7 -8
  23. data/lib/rdl/types/parser.tab.rb +108 -109
  24. data/lib/rdl/types/structural.rb +1 -0
  25. data/lib/rdl/types/tuple.rb +2 -2
  26. data/lib/rdl/types/type.rb +8 -8
  27. data/lib/rdl/types/type_inferencer.rb +1 -1
  28. data/lib/rdl/types/union.rb +2 -1
  29. data/lib/rdl/util.rb +28 -3
  30. data/lib/rdl/wrap.rb +216 -165
  31. data/lib/rdl_disable.rb +22 -15
  32. data/lib/types/core.rb +2 -4
  33. data/lib/types/core/_aliases.rb +14 -0
  34. data/lib/types/core/abbrev.rb +3 -0
  35. data/lib/types/core/array.rb +139 -0
  36. data/lib/types/core/base64.rb +8 -0
  37. data/lib/types/core/basic_object.rb +12 -0
  38. data/lib/types/core/benchmark.rb +9 -0
  39. data/lib/types/core/bigdecimal.rb +223 -0
  40. data/lib/types/core/bigmath.rb +10 -0
  41. data/lib/types/core/bignum.rb +214 -0
  42. data/lib/types/core/class.rb +15 -0
  43. data/lib/types/core/complex.rb +123 -0
  44. data/lib/types/core/coverage.rb +4 -0
  45. data/lib/types/core/csv.rb +3 -0
  46. data/lib/types/core/date.rb +4 -0
  47. data/lib/types/core/dir.rb +37 -0
  48. data/lib/types/core/encoding.rb +21 -0
  49. data/lib/types/core/enumerable.rb +96 -0
  50. data/lib/types/core/enumerator.rb +24 -0
  51. data/lib/types/core/exception.rb +15 -0
  52. data/lib/types/core/file.rb +125 -0
  53. data/lib/types/core/fileutils.rb +4 -0
  54. data/lib/types/core/fixnum.rb +213 -0
  55. data/lib/types/core/float.rb +199 -0
  56. data/lib/types/core/gem.rb +19 -0
  57. data/lib/types/core/hash.rb +72 -0
  58. data/lib/types/core/integer.rb +194 -0
  59. data/lib/types/core/io.rb +101 -0
  60. data/lib/types/core/kernel.rb +89 -0
  61. data/lib/types/core/marshal.rb +3 -0
  62. data/lib/types/core/matchdata.rb +24 -0
  63. data/lib/types/core/math.rb +50 -0
  64. data/lib/types/core/module.rb +81 -0
  65. data/lib/types/core/nil.rb +11 -0
  66. data/lib/types/core/numeric.rb +56 -0
  67. data/lib/types/core/object.rb +73 -0
  68. data/lib/types/core/pathname.rb +104 -0
  69. data/lib/types/core/proc.rb +12 -0
  70. data/lib/types/core/process.rb +110 -0
  71. data/lib/types/core/random.rb +13 -0
  72. data/lib/types/core/range.rb +37 -0
  73. data/lib/types/core/rational.rb +207 -0
  74. data/lib/types/core/regexp.rb +28 -0
  75. data/lib/types/core/set.rb +56 -0
  76. data/lib/types/core/string.rb +140 -0
  77. data/lib/types/core/strscan.rb +6 -0
  78. data/lib/types/core/symbol.rb +27 -0
  79. data/lib/types/core/time.rb +66 -0
  80. data/lib/types/core/uri.rb +18 -0
  81. data/lib/types/core/yaml.rb +3 -0
  82. data/lib/types/devise.rb +1 -0
  83. data/lib/types/devise/controller_helpers.rb +3 -0
  84. data/lib/types/devise/parameter_sanitizer.rb +2 -0
  85. data/lib/types/pundit.rb +2 -0
  86. data/lib/types/rails/_helpers.rb +50 -0
  87. data/lib/types/rails/abstract_controller/translation.rb +2 -0
  88. data/lib/types/rails/action_controller/base.rb +3 -0
  89. data/lib/types/rails/action_controller/instrumentation.rb +6 -0
  90. data/lib/types/rails/action_controller/metal.rb +3 -0
  91. data/lib/types/rails/action_controller/mime_responds.rb +13 -0
  92. data/lib/types/rails/action_controller/parameters.rb +3 -0
  93. data/lib/types/{rails-5.x → rails}/action_controller/strong_parameters.rb +4 -8
  94. data/lib/types/rails/action_dispatch/flashhash.rb +8 -0
  95. data/lib/types/rails/action_dispatch/routing.rb +10 -0
  96. data/lib/types/rails/action_mailer/base.rb +2 -0
  97. data/lib/types/rails/action_mailer/message_delivery.rb +2 -0
  98. data/lib/types/rails/action_view/helpers_sanitizehelper.rb +2 -0
  99. data/lib/types/rails/action_view/helpers_urlhelper.rb +5 -0
  100. data/lib/types/rails/active_model/errors.rb +14 -0
  101. data/lib/types/rails/active_model/validations.rb +2 -0
  102. data/lib/types/rails/active_record/associations.rb +208 -0
  103. data/lib/types/rails/active_record/base.rb +2 -0
  104. data/lib/types/rails/active_record/core.rb +2 -0
  105. data/lib/types/rails/active_record/finder_methods.rb +2 -0
  106. data/lib/types/rails/active_record/model_schema.rb +37 -0
  107. data/lib/types/rails/active_record/relation.rb +11 -0
  108. data/lib/types/rails/active_record/schema_types.rb +51 -0
  109. data/lib/types/rails/active_record/validations.rb +2 -0
  110. data/lib/types/rails/active_support/base.rb +2 -0
  111. data/lib/types/rails/active_support/logger.rb +3 -0
  112. data/lib/types/rails/active_support/tagged_logging.rb +2 -0
  113. data/lib/types/rails/active_support/time_with_zone.rb +13 -0
  114. data/lib/types/rails/active_support/time_zone.rb +2 -0
  115. data/lib/types/rails/fixnum.rb +2 -0
  116. data/lib/types/rails/integer.rb +2 -0
  117. data/lib/types/rails/rack/request.rb +2 -0
  118. data/lib/types/rails/string.rb +3 -0
  119. data/lib/types/rails/time.rb +1 -0
  120. data/rdl.gemspec +2 -2
  121. data/test/disabled_test_rdoc.rb +8 -8
  122. data/test/test_alias.rb +1 -0
  123. data/test/test_dsl.rb +4 -4
  124. data/test/test_generic.rb +45 -38
  125. data/test/test_intersection.rb +10 -10
  126. data/test/test_le.rb +103 -102
  127. data/test/test_member.rb +33 -33
  128. data/test/test_parser.rb +101 -96
  129. data/test/test_query.rb +84 -84
  130. data/test/test_rdl.rb +87 -52
  131. data/test/test_rdl_type.rb +26 -9
  132. data/test/test_type_contract.rb +32 -31
  133. data/test/test_typecheck.rb +802 -436
  134. data/test/test_types.rb +39 -39
  135. data/test/test_wrap.rb +3 -2
  136. metadata +91 -120
  137. data/extras/type_tests/%.rb +0 -171
  138. data/extras/type_tests/&.rb +0 -159
  139. data/extras/type_tests/**.rb +0 -222
  140. data/extras/type_tests/*.rb +0 -177
  141. data/extras/type_tests/+.rb +0 -170
  142. data/extras/type_tests/-.rb +0 -171
  143. data/extras/type_tests/1scomp.rb +0 -157
  144. data/extras/type_tests/<.rb +0 -170
  145. data/extras/type_tests/<<.rb +0 -159
  146. data/extras/type_tests/>>.rb +0 -159
  147. data/extras/type_tests/[].rb +0 -163
  148. data/extras/type_tests/^.rb +0 -159
  149. data/extras/type_tests/abs.rb +0 -155
  150. data/extras/type_tests/abs2.rb +0 -164
  151. data/extras/type_tests/angle.rb +0 -157
  152. data/extras/type_tests/arg.rb +0 -157
  153. data/extras/type_tests/bit_length.rb +0 -157
  154. data/extras/type_tests/ceil.rb +0 -157
  155. data/extras/type_tests/ceilRational.rb +0 -160
  156. data/extras/type_tests/conj.rb +0 -158
  157. data/extras/type_tests/defwhere.rb +0 -86
  158. data/extras/type_tests/denominator.rb +0 -157
  159. data/extras/type_tests/div.rb +0 -172
  160. data/extras/type_tests/divslash.rb +0 -179
  161. data/extras/type_tests/even?.rb +0 -157
  162. data/extras/type_tests/fdiv.rb +0 -244
  163. data/extras/type_tests/finite?.rb +0 -157
  164. data/extras/type_tests/floor.rb +0 -157
  165. data/extras/type_tests/floorRational.rb +0 -161
  166. data/extras/type_tests/hash.rb +0 -157
  167. data/extras/type_tests/imag.rb +0 -158
  168. data/extras/type_tests/infinite?.rb +0 -157
  169. data/extras/type_tests/modulo.rb +0 -171
  170. data/extras/type_tests/nan?.rb +0 -157
  171. data/extras/type_tests/neg.rb +0 -155
  172. data/extras/type_tests/next.rb +0 -157
  173. data/extras/type_tests/next_float.rb +0 -157
  174. data/extras/type_tests/numerator.rb +0 -157
  175. data/extras/type_tests/phase.rb +0 -157
  176. data/extras/type_tests/prev_float.rb +0 -157
  177. data/extras/type_tests/quo.rb +0 -179
  178. data/extras/type_tests/rationalize.rb +0 -157
  179. data/extras/type_tests/rationalizeArg.rb +0 -198
  180. data/extras/type_tests/real.rb +0 -157
  181. data/extras/type_tests/real?.rb +0 -157
  182. data/extras/type_tests/round.rb +0 -157
  183. data/extras/type_tests/roundArg.rb +0 -169
  184. data/extras/type_tests/size.rb +0 -157
  185. data/extras/type_tests/to_c.rb +0 -157
  186. data/extras/type_tests/to_f.rb +0 -155
  187. data/extras/type_tests/to_i.rb +0 -157
  188. data/extras/type_tests/to_r.rb +0 -157
  189. data/extras/type_tests/to_s.rb +0 -157
  190. data/extras/type_tests/truncate.rb +0 -157
  191. data/extras/type_tests/truncateArg.rb +0 -166
  192. data/extras/type_tests/type tests +0 -1
  193. data/extras/type_tests/zero?.rb +0 -155
  194. data/extras/type_tests/|.rb +0 -159
  195. data/lib/types/core-ruby-2.x/_aliases.rb +0 -15
  196. data/lib/types/core-ruby-2.x/abbrev.rb +0 -5
  197. data/lib/types/core-ruby-2.x/array.rb +0 -137
  198. data/lib/types/core-ruby-2.x/base64.rb +0 -10
  199. data/lib/types/core-ruby-2.x/basic_object.rb +0 -14
  200. data/lib/types/core-ruby-2.x/benchmark.rb +0 -11
  201. data/lib/types/core-ruby-2.x/bigdecimal.rb +0 -224
  202. data/lib/types/core-ruby-2.x/bigmath.rb +0 -12
  203. data/lib/types/core-ruby-2.x/bignum.rb +0 -214
  204. data/lib/types/core-ruby-2.x/class.rb +0 -17
  205. data/lib/types/core-ruby-2.x/complex.rb +0 -124
  206. data/lib/types/core-ruby-2.x/coverage.rb +0 -6
  207. data/lib/types/core-ruby-2.x/csv.rb +0 -5
  208. data/lib/types/core-ruby-2.x/date.rb +0 -6
  209. data/lib/types/core-ruby-2.x/dir.rb +0 -38
  210. data/lib/types/core-ruby-2.x/encoding.rb +0 -23
  211. data/lib/types/core-ruby-2.x/enumerable.rb +0 -98
  212. data/lib/types/core-ruby-2.x/enumerator.rb +0 -26
  213. data/lib/types/core-ruby-2.x/exception.rb +0 -17
  214. data/lib/types/core-ruby-2.x/file.rb +0 -126
  215. data/lib/types/core-ruby-2.x/fileutils.rb +0 -6
  216. data/lib/types/core-ruby-2.x/fixnum.rb +0 -213
  217. data/lib/types/core-ruby-2.x/float.rb +0 -199
  218. data/lib/types/core-ruby-2.x/gem.rb +0 -247
  219. data/lib/types/core-ruby-2.x/hash.rb +0 -72
  220. data/lib/types/core-ruby-2.x/integer.rb +0 -197
  221. data/lib/types/core-ruby-2.x/io.rb +0 -103
  222. data/lib/types/core-ruby-2.x/kernel.rb +0 -90
  223. data/lib/types/core-ruby-2.x/marshal.rb +0 -5
  224. data/lib/types/core-ruby-2.x/matchdata.rb +0 -26
  225. data/lib/types/core-ruby-2.x/math.rb +0 -53
  226. data/lib/types/core-ruby-2.x/module.rb +0 -83
  227. data/lib/types/core-ruby-2.x/nil.rb +0 -12
  228. data/lib/types/core-ruby-2.x/numeric.rb +0 -56
  229. data/lib/types/core-ruby-2.x/object.rb +0 -75
  230. data/lib/types/core-ruby-2.x/pathname.rb +0 -106
  231. data/lib/types/core-ruby-2.x/proc.rb +0 -16
  232. data/lib/types/core-ruby-2.x/process.rb +0 -127
  233. data/lib/types/core-ruby-2.x/random.rb +0 -17
  234. data/lib/types/core-ruby-2.x/range.rb +0 -39
  235. data/lib/types/core-ruby-2.x/rational.rb +0 -209
  236. data/lib/types/core-ruby-2.x/regexp.rb +0 -30
  237. data/lib/types/core-ruby-2.x/set.rb +0 -58
  238. data/lib/types/core-ruby-2.x/string.rb +0 -143
  239. data/lib/types/core-ruby-2.x/strscan.rb +0 -7
  240. data/lib/types/core-ruby-2.x/symbol.rb +0 -29
  241. data/lib/types/core-ruby-2.x/time.rb +0 -68
  242. data/lib/types/core-ruby-2.x/uri.rb +0 -20
  243. data/lib/types/core-ruby-2.x/yaml.rb +0 -5
  244. data/lib/types/rails-5.x/_helpers.rb +0 -52
  245. data/lib/types/rails-5.x/action_controller/mime_responds.rb +0 -11
  246. data/lib/types/rails-5.x/action_dispatch/routing.rb +0 -10
  247. data/lib/types/rails-5.x/active_model/errors.rb +0 -15
  248. data/lib/types/rails-5.x/active_model/validations.rb +0 -5
  249. data/lib/types/rails-5.x/active_record/associations.rb +0 -190
  250. data/lib/types/rails-5.x/active_record/core.rb +0 -3
  251. data/lib/types/rails-5.x/active_record/model_schema.rb +0 -39
  252. data/lib/types/rails-5.x/fixnum.rb +0 -3
@@ -1,157 +0,0 @@
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
-
@@ -1,157 +0,0 @@
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
-
@@ -1,161 +0,0 @@
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+'#floor',y)
18
- expected_type = operation_type[operation_type.index('->')+3..-1]
19
- w = x.floor(y)
20
- puts 'here'
21
- test_result = w.is_a?(Object.const_get(expected_type))
22
- if !test_result
23
- puts "Arg1= #{x} (type: #{type_one})"
24
- puts "Arg2= #{y} (type: #{type_two})"
25
- puts "Res= #{w}"
26
- puts "Expected type: #{expected_type}"
27
- puts "Received type: #{w.class}"
28
- end
29
- #puts test_result
30
- return test_result
31
- end
32
-
33
- def gen_fixnum()
34
- return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
35
- end
36
-
37
- def gen_bignum()
38
- r = Random.rand()
39
- if r<0.5
40
- return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
41
- else
42
- return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
43
- end
44
- end
45
-
46
- def gen_float()
47
- r = Random.rand()
48
- if r<0.5
49
- return Float::MAX*Random.rand
50
- else
51
- return -1*Float::MAX*Random.rand
52
- end
53
- end
54
-
55
- def gen_bigdec()
56
- r = Random.rand()
57
- if r<0.33
58
- return BigDecimal.new(gen_fixnum())
59
- elsif r<0.66
60
- return BigDecimal.new(gen_bignum())
61
- else
62
- return BigDecimal.new(gen_float(),0)
63
- end
64
- end
65
-
66
- def gen_complex()
67
- x = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
68
- #puts x
69
- y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
70
- #puts y
71
- return Complex(x,y)
72
- end
73
-
74
- def gen_rational()
75
- x = gen_fixnum()
76
- y = gen_fixnum()
77
- return Rational(x,y)
78
- end
79
-
80
-
81
- def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
82
- r = Random.rand()
83
- if r<probFixnum then
84
- #Fixnum type
85
- x = gen_fixnum()
86
- elsif r<(probFixnum+probBignum)
87
- x = gen_bignum()
88
- elsif r<(probFixnum+probBignum+probBigDec)
89
- #BigDecimal type
90
- x = gen_bigdec()
91
- elsif r<(probFixnum+probBignum+probBigDec+probInf)
92
- x=Float::INFINITY
93
- elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
94
- x=Float::NAN
95
- elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
96
- #Random Float type
97
- x = gen_float()
98
- elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
99
- x= gen_complex()
100
- elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
101
- x = gen_rational()
102
- end
103
- return x
104
- end
105
-
106
- def rounds(x)
107
- counter = 0
108
- for i in 0..x
109
- b= test()
110
- if (!b) then
111
- counter=counter+1
112
- end
113
-
114
- end
115
- return counter
116
- end
117
-
118
-
119
- def query(q,y)
120
- $__rdl_contract_switch.off {
121
- if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
122
- klass = nil
123
- klass_pref = nil
124
- meth = nil
125
- if q =~ /(.+)#(.+)/
126
- klass = $1
127
- klass_pref = "#{klass}#"
128
- meth = $2.to_sym
129
- elsif q =~ /(.+)\.(.+)/
130
- klass_pref = "#{$1}."
131
- klass = RDL::Util.add_singleton_marker($1)
132
- meth = $2.to_sym
133
- else
134
- klass = self.class.to_s
135
- klass_pref = "#{klass}#"
136
- meth = q.to_sym
137
- end
138
- if RDL::Wrap.has_contracts?(klass, meth, :type)
139
- typs = RDL::Wrap.get_contracts(klass, meth, :type)
140
- typs.each { |t|
141
- #puts "#{klass_pref}#{meth}: #{t}"
142
- t_string = "#{t}"
143
- t_string =~ /\((\w*)\)(.+)/
144
- if $1!=""
145
- #catch negative sign case
146
- if y.is_a?(Object.const_get($1))
147
- return t_string
148
- end
149
- end
150
- #return "#{t}"
151
- }
152
-
153
- else
154
- #puts "No type for #{klass_pref}#{meth}"
155
- end
156
- else
157
- #puts "Not implemented"
158
- end
159
- }
160
- end
161
-