rdl 1.1.0 → 1.1.1.rc1

Sign up to get free protection for your applications and to get access to all the features.
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,155 @@
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
+ #puts "Arg2= #{y} and type = #{type_two}"
15
+ operation_type = query(type_one+'#abs',nil)
16
+ expected_type = operation_type[operation_type.index('->')+3..-1]
17
+ w = x.abs
18
+ test_result = w.is_a?(Object.const_get(expected_type))
19
+ if !test_result
20
+ puts "Arg1= #{x} (type: #{type_one})"
21
+ puts "Arg2= #{y} (type: #{type_two})"
22
+ puts "Res= #{w}"
23
+ puts "Expected type: #{expected_type}"
24
+ puts "Received type: #{w.class}"
25
+ end
26
+ #puts test_result
27
+ return test_result
28
+ end
29
+
30
+ def gen_fixnum()
31
+ return Random.rand(MIN_FIXNUM..MAX_FIXNUM)
32
+ end
33
+
34
+ def gen_bignum()
35
+ r = Random.rand()
36
+ if r<0.5
37
+ return Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
38
+ else
39
+ return -1*Random.rand(MAX_FIXNUM+1..MAX_FIXNUM*1000)
40
+ end
41
+ end
42
+
43
+ def gen_float()
44
+ r = Random.rand()
45
+ if r<0.5
46
+ return Float::MAX*Random.rand
47
+ else
48
+ return -1*Float::MAX*Random.rand
49
+ end
50
+ end
51
+
52
+ def gen_bigdec()
53
+ r = Random.rand()
54
+ if r<0.33
55
+ return BigDecimal.new(gen_fixnum())
56
+ elsif r<0.66
57
+ return BigDecimal.new(gen_bignum())
58
+ else
59
+ return BigDecimal.new(gen_float(),0)
60
+ end
61
+ end
62
+
63
+ def gen_complex()
64
+ x = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
65
+ #puts x
66
+ y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
67
+ #puts y
68
+ return Complex(x,y)
69
+ end
70
+
71
+ def gen_rational()
72
+ x = gen_fixnum()
73
+ y = gen_fixnum()
74
+ return Rational(x,y)
75
+ end
76
+
77
+
78
+ def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
79
+ r = Random.rand()
80
+ if r<probFixnum then
81
+ #Fixnum type
82
+ x = gen_fixnum()
83
+ elsif r<(probFixnum+probBignum)
84
+ x = gen_bignum()
85
+ elsif r<(probFixnum+probBignum+probBigDec)
86
+ #BigDecimal type
87
+ x = gen_bigdec()
88
+ elsif r<(probFixnum+probBignum+probBigDec+probInf)
89
+ x=Float::INFINITY
90
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
91
+ x=Float::NAN
92
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
93
+ #Random Float type
94
+ x = gen_float()
95
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
96
+ x= gen_complex()
97
+ elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
98
+ x = gen_rational()
99
+ end
100
+ return x
101
+ end
102
+
103
+ def rounds(x)
104
+ counter = 0
105
+ for i in 0..x
106
+ b= test()
107
+ if (!b) then
108
+ counter=counter+1
109
+ end
110
+
111
+ end
112
+ return counter
113
+ end
114
+
115
+
116
+ def query(q,y)
117
+ $__rdl_contract_switch.off {
118
+ if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
119
+ klass = nil
120
+ klass_pref = nil
121
+ meth = nil
122
+ if q =~ /(.+)#(.+)/
123
+ klass = $1
124
+ klass_pref = "#{klass}#"
125
+ meth = $2.to_sym
126
+ elsif q =~ /(.+)\.(.+)/
127
+ klass_pref = "#{$1}."
128
+ klass = RDL::Util.add_singleton_marker($1)
129
+ meth = $2.to_sym
130
+ else
131
+ klass = self.class.to_s
132
+ klass_pref = "#{klass}#"
133
+ meth = q.to_sym
134
+ end
135
+ if RDL::Wrap.has_contracts?(klass, meth, :type)
136
+ typs = RDL::Wrap.get_contracts(klass, meth, :type)
137
+ typs.each { |t|
138
+ #puts "#{klass_pref}#{meth}: #{t}"
139
+ t_string = "#{t}"
140
+ t_string =~ /\((\w*)\)(.+)/
141
+ if $1==""
142
+ return t_string
143
+ end
144
+ #return "#{t}"
145
+ }
146
+
147
+ else
148
+ #puts "No type for #{klass_pref}#{meth}"
149
+ end
150
+ else
151
+ #puts "Not implemented"
152
+ end
153
+ }
154
+ end
155
+
@@ -0,0 +1,164 @@
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+'#abs2',nil)
15
+ expected_type = operation_type[operation_type.index('->')+3..-1]
16
+ w = x.abs2
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
+ if x.is_a?(BigDecimal)
69
+ y = gen_number(0.25,0.25,0.2,0,0,0.2,0,0.1)
70
+ elsif x.is_a?(Float)&&(x==Float::INFINITY|| x.nan?)
71
+ y = gen_number(0.25,0.25,0,0.1,0.1,0.2,0,0.1)
72
+ else
73
+ y = gen_number(0.2,0.2,0.1,0.05,0.05,0.3,0,0.1)
74
+ #puts y
75
+ end
76
+ return Complex(x,y)
77
+ end
78
+
79
+ def gen_rational()
80
+ x = gen_fixnum()
81
+ y = gen_fixnum()
82
+ return Rational(x,y)
83
+ end
84
+
85
+
86
+ def gen_number(probFixnum,probBignum,probBigDec,probInf,probNAN,probFloat,probComplex,probRational)
87
+ r = Random.rand()
88
+ if r<probFixnum then
89
+ #Fixnum type
90
+ x = gen_fixnum()
91
+ elsif r<(probFixnum+probBignum)
92
+ x = gen_bignum()
93
+ elsif r<(probFixnum+probBignum+probBigDec)
94
+ #BigDecimal type
95
+ x = gen_bigdec()
96
+ elsif r<(probFixnum+probBignum+probBigDec+probInf)
97
+ x=Float::INFINITY
98
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN)
99
+ x=Float::NAN
100
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat)
101
+ #Random Float type
102
+ x = gen_float()
103
+ elsif r<(probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex)
104
+ x= gen_complex()
105
+ elsif (probFixnum+probBignum+probBigDec+probInf+probNAN+probFloat+probComplex+probRational)
106
+ x = gen_rational()
107
+ end
108
+ return x
109
+ end
110
+
111
+ def rounds(x)
112
+ counter = 0
113
+ for i in 0..x
114
+ b= test()
115
+ if (!b) then
116
+ counter=counter+1
117
+ end
118
+
119
+ end
120
+ return counter
121
+ end
122
+
123
+
124
+ def query(q,y)
125
+ $__rdl_contract_switch.off {
126
+ if q =~ /^(\w+(#|\.))?(\w+(!|\?|=)?|!|~|\+|\*\*|-|\*|\/|%|<<|>>|&|\||\^|<|<=|=>|>|==|===|!=|=~|!~|<=>|\[\]|\[\]=)$/
127
+ klass = nil
128
+ klass_pref = nil
129
+ meth = nil
130
+ if q =~ /(.+)#(.+)/
131
+ klass = $1
132
+ klass_pref = "#{klass}#"
133
+ meth = $2.to_sym
134
+ elsif q =~ /(.+)\.(.+)/
135
+ klass_pref = "#{$1}."
136
+ klass = RDL::Util.add_singleton_marker($1)
137
+ meth = $2.to_sym
138
+ else
139
+ klass = self.class.to_s
140
+ klass_pref = "#{klass}#"
141
+ meth = q.to_sym
142
+ end
143
+ if RDL::Wrap.has_contracts?(klass, meth, :type)
144
+ typs = RDL::Wrap.get_contracts(klass, meth, :type)
145
+ typs.each { |t|
146
+ #puts "#{klass_pref}#{meth}: #{t}"
147
+ t_string = "#{t}"
148
+ #puts t_string
149
+ t_string =~ /\((\w*)\)(.+)/
150
+ if $1==""
151
+ return t_string
152
+ end
153
+ #return "#{t}"
154
+ }
155
+
156
+ else
157
+ #puts "No type for #{klass_pref}#{meth}"
158
+ end
159
+ else
160
+ #puts "Not implemented"
161
+ end
162
+ }
163
+ end
164
+
@@ -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.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
+ #puts "Arg2= #{y} and type = #{type_two}"
15
+ operation_type = query(type_one+'#angle',nil)
16
+ expected_type = operation_type[operation_type.index('->')+3..-1]
17
+ w = x.angle
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
+