haskell 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +16 -31
- data/Rakefile +9 -4
- data/bin/{haskell → rubype} +1 -1
- data/ext/rubype/extconf.rb +3 -0
- data/ext/rubype/rubype.c +38 -0
- data/ext/rubype/rubype.h +6 -0
- data/lib/rubype/version.rb +3 -0
- data/lib/{haskell.rb → rubype.rb} +11 -10
- data/{haskell.gemspec → rubype.gemspec} +4 -4
- data/test/minitest_helper.rb +1 -1
- data/test/test_rubype.rb +107 -0
- metadata +14 -15
- data/ext/haskell/extconf.rb +0 -3
- data/ext/haskell/haskell.c +0 -9
- data/ext/haskell/haskell.h +0 -6
- data/lib/haskell/type_pair.rb +0 -7
- data/lib/haskell/version.rb +0 -3
- data/test/test_haskell.rb +0 -113
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3c9ffa1d1b36cb7926952b21760fbf551702a43
|
4
|
+
data.tar.gz: 74e7d0eefc40f2d5564b3adc4cb484f4ce9e6135
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 013a5b1881c581a93a8075974edcf3aa3f12d175cfd4957b87948b41599181ed484579053b9b7683a4b699c30e97d94256ef333d49d8de099b339162bb388355
|
7
|
+
data.tar.gz: 16ddb4cb6b778cfad27173c79809063c9d6856d15628aac70cba9d1405a177872389f6f6551d1cb16c015d249934e12d4cebe0d5769ae2dab7007ceb16eb725d
|
data/README.md
CHANGED
@@ -5,17 +5,19 @@ Matz has mentioned Ruby3.0 with static type at some confluences. But almost all
|
|
5
5
|
But it's worth thinking more. This gem is kind of trial without so much side-effect.
|
6
6
|
|
7
7
|
```rb
|
8
|
-
require '
|
8
|
+
require 'rubype'
|
9
9
|
|
10
|
-
# ex1
|
10
|
+
# ex1
|
11
11
|
class MyClass
|
12
|
-
|
12
|
+
def sum(x, y)
|
13
13
|
x + y
|
14
14
|
end
|
15
|
+
typesig sum: [Numeric, Numeric => Numeric]
|
15
16
|
|
16
|
-
|
17
|
+
def wrong_sum(x, y)
|
17
18
|
'string'
|
18
19
|
end
|
20
|
+
typesig wrong_sum: [Numeric, Numeric => Numeric]
|
19
21
|
end
|
20
22
|
|
21
23
|
MyClass.new.sum(1, 2)
|
@@ -28,27 +30,19 @@ MyClass.new.wrong_sum(1, 2)
|
|
28
30
|
#=> TypeError: Expected wrong_sum to return Numeric but got "str" instead
|
29
31
|
|
30
32
|
|
31
|
-
# ex2
|
33
|
+
# ex2
|
32
34
|
class People
|
33
35
|
type People >= Any, def marry(people)
|
34
36
|
# Your Ruby code as usual
|
35
37
|
end
|
36
38
|
end
|
39
|
+
typesig marry: [People => Any]
|
37
40
|
|
38
41
|
People.new.marry(People.new)
|
39
42
|
#=> no error
|
40
43
|
|
41
44
|
People.new.marry('non people')
|
42
45
|
#=> ArgumentError: Wrong type of argument, type of "non people" should be People
|
43
|
-
|
44
|
-
|
45
|
-
# ex3: (Ruby 1.8.0+)
|
46
|
-
class MyClass
|
47
|
-
def sum(x, y)
|
48
|
-
x + y
|
49
|
-
end
|
50
|
-
type Numeric, Numeric >= Numeric, :sum
|
51
|
-
end
|
52
46
|
```
|
53
47
|
|
54
48
|
## Feature
|
@@ -57,11 +51,12 @@ end
|
|
57
51
|
```ruby
|
58
52
|
# It's totally OK!!
|
59
53
|
class MyClass
|
60
|
-
|
54
|
+
def sum(x, y)
|
61
55
|
x + y
|
62
56
|
end
|
57
|
+
typesig sum: [Numeric, Numeric => Numeric]
|
63
58
|
|
64
|
-
def
|
59
|
+
def sum_without_type(x, y)
|
65
60
|
'string'
|
66
61
|
end
|
67
62
|
end
|
@@ -72,9 +67,10 @@ end
|
|
72
67
|
```ruby
|
73
68
|
|
74
69
|
class MyClass
|
75
|
-
|
70
|
+
def foo(any_obj)
|
76
71
|
1
|
77
72
|
end
|
73
|
+
typesig sum: [Any => Numeric]
|
78
74
|
end
|
79
75
|
|
80
76
|
# It's totally OK!!
|
@@ -85,24 +81,13 @@ MyClass.new.foo('str')
|
|
85
81
|
|
86
82
|
## Installation
|
87
83
|
|
88
|
-
|
89
|
-
|
90
|
-
```ruby
|
91
|
-
gem 'haskell'
|
92
|
-
```
|
93
|
-
|
94
|
-
And then execute:
|
95
|
-
|
96
|
-
$ bundle
|
97
|
-
|
98
|
-
Or install it yourself as:
|
99
|
-
|
100
|
-
$ gem install haskell
|
84
|
+
gem install rubype or add gem 'rubype' to your Gemfile.
|
101
85
|
|
86
|
+
This gem requires Ruby 2.0.0+.
|
102
87
|
|
103
88
|
### Contributing
|
104
89
|
|
105
|
-
Fork it ( https://github.com/[my-github-username]/
|
90
|
+
Fork it ( https://github.com/[my-github-username]/rubype/fork )
|
106
91
|
|
107
92
|
Create your feature branch (`git checkout -b my-new-feature`)
|
108
93
|
|
data/Rakefile
CHANGED
@@ -5,10 +5,15 @@ Rake::TestTask.new(:test) do |t|
|
|
5
5
|
t.libs << "test"
|
6
6
|
end
|
7
7
|
|
8
|
-
task :default => :test
|
9
|
-
|
10
8
|
require "rake/extensiontask"
|
11
9
|
|
12
|
-
Rake::ExtensionTask.new("
|
13
|
-
ext.lib_dir = "lib/
|
10
|
+
Rake::ExtensionTask.new("rubype") do |ext|
|
11
|
+
ext.lib_dir = "lib/rubype"
|
12
|
+
end
|
13
|
+
|
14
|
+
task :compile_and_test do
|
15
|
+
Rake::Task['compile'].invoke
|
16
|
+
Rake::Task['test'].invoke
|
14
17
|
end
|
18
|
+
|
19
|
+
task default: :compile_and_test
|
data/bin/{haskell → rubype}
RENAMED
data/ext/rubype/rubype.c
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#include "rubype.h"
|
2
|
+
|
3
|
+
VALUE rb_mRubype, rb_cAny, rb_mBoolean, rb_cTypePair;
|
4
|
+
|
5
|
+
#define STR2SYM(x) ID2SYM(rb_intern(x))
|
6
|
+
|
7
|
+
static VALUE
|
8
|
+
rb_mod_prepend(int argc, VALUE *argv, VALUE module)
|
9
|
+
{
|
10
|
+
int i;
|
11
|
+
ID id_prepend_features, id_prepended;
|
12
|
+
|
13
|
+
CONST_ID(id_prepend_features, "prepend_features");
|
14
|
+
CONST_ID(id_prepended, "prepended");
|
15
|
+
for (i = 0; i < argc; i++)
|
16
|
+
Check_Type(argv[i], T_MODULE);
|
17
|
+
while (argc--) {
|
18
|
+
rb_funcall(argv[argc], id_prepend_features, 1, module);
|
19
|
+
rb_funcall(argv[argc], id_prepended, 1, module);
|
20
|
+
}
|
21
|
+
|
22
|
+
return module;
|
23
|
+
}
|
24
|
+
|
25
|
+
void
|
26
|
+
Init_rubype(void)
|
27
|
+
{
|
28
|
+
// rb_mRubype = rb_define_module("Rubype");
|
29
|
+
// rb_cAny = rb_define_class("Any", rb_cObject);
|
30
|
+
// rb_mBoolean = rb_define_module("Boolean");
|
31
|
+
// rb_include_module(rb_cTrueClass, rb_mBoolean);
|
32
|
+
// rb_include_module(rb_cFalseClass, rb_mBoolean);
|
33
|
+
// rb_define_class(
|
34
|
+
// "TypePair",
|
35
|
+
// rb_funcall(rb_cStruct, rb_intern("new"), 2, STR2SYM("last_arg_type"), STR2SYM("rtn_type"))
|
36
|
+
// );
|
37
|
+
rb_define_method(rb_cModule, "prepend", rb_mod_prepend, -1);
|
38
|
+
}
|
data/ext/rubype/rubype.h
ADDED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "rubype/rubype"
|
2
2
|
|
3
3
|
# Builtin Contracts
|
4
4
|
class Any; end
|
@@ -8,25 +8,26 @@ FalseClass.send(:include, Boolean)
|
|
8
8
|
|
9
9
|
class Module
|
10
10
|
private
|
11
|
-
def
|
12
|
-
prepend (@
|
13
|
-
@
|
11
|
+
def __rubype__
|
12
|
+
prepend (@__rubype__ = Module.new) unless @__rubype__
|
13
|
+
@__rubype__
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def typesig(hash)
|
17
|
+
meth = hash.keys.first
|
18
|
+
*arg_types, type_pair = hash.values.first
|
18
19
|
|
19
|
-
|
20
|
-
::
|
20
|
+
__rubype__.send(:define_method, meth) do |*args, &block|
|
21
|
+
::Rubype.assert_arg_type(meth, args, arg_types << type_pair.keys.first)
|
21
22
|
rtn = super(*args, &block)
|
22
|
-
::
|
23
|
+
::Rubype.assert_trn_type(meth, rtn, type_pair.values.first)
|
23
24
|
rtn
|
24
25
|
end
|
25
26
|
self
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
module
|
30
|
+
module Rubype
|
30
31
|
class << self
|
31
32
|
def assert_arg_type(meth, args, klasses)
|
32
33
|
args.each_with_index do |arg, i|
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require '
|
4
|
+
require 'rubype/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "haskell"
|
8
|
-
spec.version =
|
8
|
+
spec.version = Rubype::VERSION
|
9
9
|
spec.authors = ["gogotanaka"]
|
10
10
|
spec.email = ["mail@tanakakazuki.com"]
|
11
|
-
spec.extensions = ["ext/
|
11
|
+
spec.extensions = ["ext/rubype/extconf.rb"]
|
12
12
|
spec.summary = %q{Ruby with type.}
|
13
13
|
spec.description = %q{Ruby with type.}
|
14
|
-
spec.homepage = "http://
|
14
|
+
spec.homepage = "http://gogotanaka.me/"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0")
|
data/test/minitest_helper.rb
CHANGED
data/test/test_rubype.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
class TypePair
|
3
|
+
def to_s
|
4
|
+
"#{last_arg_type} => #{rtn_type}"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
class TestRubype < MiniTest::Unit::TestCase
|
8
|
+
def setup
|
9
|
+
@string = 'str'
|
10
|
+
@numeric = 1
|
11
|
+
@symbol = :test
|
12
|
+
@array = [1, 2, 3]
|
13
|
+
@hash = { test: :hash }
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_correct_type
|
17
|
+
assert_correct_type [Numeric => Numeric], [@numeric], @numeric
|
18
|
+
assert_correct_type [Numeric => Array ], [@numeric], @array
|
19
|
+
assert_correct_type [Numeric => String ], [@numeric], @string
|
20
|
+
assert_correct_type [Numeric => Hash ], [@numeric], @hash
|
21
|
+
assert_correct_type [Numeric => Symbol ], [@numeric], @symbol
|
22
|
+
assert_correct_type [Numeric => Boolean], [@numeric], true
|
23
|
+
assert_correct_type [Numeric => Boolean], [@numeric], false
|
24
|
+
|
25
|
+
assert_correct_type [Boolean, Numeric => Numeric], [true, @numeric], @numeric
|
26
|
+
assert_correct_type [Boolean, Array => Array ], [true, @array ], @array
|
27
|
+
assert_correct_type [Boolean, String => String ], [true, @string ], @string
|
28
|
+
assert_correct_type [Boolean, Hash => Hash ], [true, @hash ], @hash
|
29
|
+
assert_correct_type [Boolean, Symbol => Symbol ], [true, @symbol ], @symbol
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_wrong_return_type
|
33
|
+
assert_wrong_rtn [Numeric => Numeric], [@numeric], @array
|
34
|
+
assert_wrong_rtn [Numeric => Numeric], [@numeric], @string
|
35
|
+
assert_wrong_rtn [Numeric => Numeric], [@numeric], @hash
|
36
|
+
assert_wrong_rtn [Numeric => Numeric], [@numeric], @symbol
|
37
|
+
assert_wrong_rtn [Numeric => Numeric], [@numeric], true
|
38
|
+
|
39
|
+
assert_wrong_rtn [Numeric, Numeric => Numeric], [@numeric, @numeric], @array
|
40
|
+
assert_wrong_rtn [Numeric, Numeric => Numeric], [@numeric, @numeric], @string
|
41
|
+
assert_wrong_rtn [Numeric, Numeric => Numeric], [@numeric, @numeric], @hash
|
42
|
+
assert_wrong_rtn [Numeric, Numeric => Numeric], [@numeric, @numeric], @symbol
|
43
|
+
assert_wrong_rtn [Numeric, Numeric => Numeric], [@numeric, @numeric], true
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_wrong_args_type
|
47
|
+
assert_wrong_arg [Numeric => Numeric], [@array ], @numeric
|
48
|
+
assert_wrong_arg [Numeric => Numeric], [@string], @numeric
|
49
|
+
assert_wrong_arg [Numeric => Numeric], [@hash ], @numeric
|
50
|
+
assert_wrong_arg [Numeric => Numeric], [@symbol], @numeric
|
51
|
+
assert_wrong_arg [Numeric => Numeric], [true ], @numeric
|
52
|
+
|
53
|
+
assert_wrong_arg [Numeric, Numeric => Numeric], [@numeric, @array ], @numeric
|
54
|
+
assert_wrong_arg [Numeric, Numeric => Numeric], [@numeric, @string], @numeric
|
55
|
+
assert_wrong_arg [Numeric, Numeric => Numeric], [@numeric, @hash ], @numeric
|
56
|
+
assert_wrong_arg [Numeric, Numeric => Numeric], [@numeric, @symbol], @numeric
|
57
|
+
assert_wrong_arg [Numeric, Numeric => Numeric], [@numeric, true ], @numeric
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_any
|
61
|
+
assert_correct_type [Any => Any], [@array ], @numeric
|
62
|
+
assert_correct_type [Any => Any], [@string], @numeric
|
63
|
+
assert_correct_type [Any => Any], [@hash ], @numeric
|
64
|
+
assert_correct_type [Any => Any], [@symbol], @numeric
|
65
|
+
|
66
|
+
assert_correct_type [Any, Any => Any], [@numeric, @array ], @numeric
|
67
|
+
assert_correct_type [Any, Any => Any], [@numeric, @string], @numeric
|
68
|
+
assert_correct_type [Any, Any => Any], [@numeric, @hash ], @numeric
|
69
|
+
assert_correct_type [Any, Any => Any], [@numeric, @symbol], @numeric
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def assert_equal_to_s(str, val)
|
74
|
+
assert_equal str, val.to_s
|
75
|
+
end
|
76
|
+
|
77
|
+
def assert_correct_type(type_list, args, val)
|
78
|
+
assert_equal val, define_test_method(type_list, args, val).call(*args)
|
79
|
+
end
|
80
|
+
|
81
|
+
def assert_wrong_arg(type_list, args, val)
|
82
|
+
assert_raises(ArgumentError) { define_test_method(type_list, args, val).call(*args) }
|
83
|
+
end
|
84
|
+
|
85
|
+
def assert_wrong_rtn(type_list, args, val)
|
86
|
+
assert_raises(TypeError) { define_test_method(type_list, args, val).call(*args) }
|
87
|
+
end
|
88
|
+
|
89
|
+
def define_test_method(type_list, args, val)
|
90
|
+
klass = Class.new.class_eval <<-RUBY_CODE
|
91
|
+
def call(#{arg_literal(args.count)})
|
92
|
+
#{obj_literal(val)}
|
93
|
+
end
|
94
|
+
typesig call: #{obj_literal(type_list)}
|
95
|
+
RUBY_CODE
|
96
|
+
|
97
|
+
klass.new
|
98
|
+
end
|
99
|
+
|
100
|
+
def obj_literal(obj)
|
101
|
+
"ObjectSpace._id2ref(#{obj.__id__})"
|
102
|
+
end
|
103
|
+
|
104
|
+
def arg_literal(count)
|
105
|
+
('a'..'z').to_a[0..count-1].join(',')
|
106
|
+
end
|
107
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haskell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- gogotanaka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,9 +70,9 @@ description: Ruby with type.
|
|
70
70
|
email:
|
71
71
|
- mail@tanakakazuki.com
|
72
72
|
executables:
|
73
|
-
-
|
73
|
+
- rubype
|
74
74
|
extensions:
|
75
|
-
- ext/
|
75
|
+
- ext/rubype/extconf.rb
|
76
76
|
extra_rdoc_files: []
|
77
77
|
files:
|
78
78
|
- ".gitignore"
|
@@ -81,17 +81,16 @@ files:
|
|
81
81
|
- LICENSE.txt
|
82
82
|
- README.md
|
83
83
|
- Rakefile
|
84
|
-
- bin/
|
85
|
-
- ext/
|
86
|
-
- ext/
|
87
|
-
- ext/
|
88
|
-
-
|
89
|
-
- lib/
|
90
|
-
-
|
91
|
-
- lib/haskell/version.rb
|
84
|
+
- bin/rubype
|
85
|
+
- ext/rubype/extconf.rb
|
86
|
+
- ext/rubype/rubype.c
|
87
|
+
- ext/rubype/rubype.h
|
88
|
+
- lib/rubype.rb
|
89
|
+
- lib/rubype/version.rb
|
90
|
+
- rubype.gemspec
|
92
91
|
- test/minitest_helper.rb
|
93
|
-
- test/
|
94
|
-
homepage: http://
|
92
|
+
- test/test_rubype.rb
|
93
|
+
homepage: http://gogotanaka.me/
|
95
94
|
licenses:
|
96
95
|
- MIT
|
97
96
|
metadata: {}
|
@@ -117,4 +116,4 @@ specification_version: 4
|
|
117
116
|
summary: Ruby with type.
|
118
117
|
test_files:
|
119
118
|
- test/minitest_helper.rb
|
120
|
-
- test/
|
119
|
+
- test/test_rubype.rb
|
data/ext/haskell/extconf.rb
DELETED
data/ext/haskell/haskell.c
DELETED
data/ext/haskell/haskell.h
DELETED
data/lib/haskell/type_pair.rb
DELETED
data/lib/haskell/version.rb
DELETED
data/test/test_haskell.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'minitest_helper'
|
2
|
-
class TypePair
|
3
|
-
def to_s
|
4
|
-
"#{last_arg_type} >= #{rtn_type}"
|
5
|
-
end
|
6
|
-
end
|
7
|
-
class TestHaskell < MiniTest::Unit::TestCase
|
8
|
-
def setup
|
9
|
-
@string = 'str'
|
10
|
-
@numeric = 1
|
11
|
-
@symbol = :test
|
12
|
-
@array = [1, 2, 3]
|
13
|
-
@hash = { test: :hash }
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_type_list
|
17
|
-
assert_equal_to_s "Numeric >= Numeric", Numeric >= Numeric
|
18
|
-
assert_equal_to_s "Numeric >= Array", Numeric >= Array
|
19
|
-
assert_equal_to_s "Array >= String", Array >= String
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_correct_type
|
23
|
-
assert_correct_type [Numeric >= Numeric], [@numeric], @numeric
|
24
|
-
assert_correct_type [Numeric >= Array ], [@numeric], @array
|
25
|
-
assert_correct_type [Numeric >= String ], [@numeric], @string
|
26
|
-
assert_correct_type [Numeric >= Hash ], [@numeric], @hash
|
27
|
-
assert_correct_type [Numeric >= Symbol ], [@numeric], @symbol
|
28
|
-
assert_correct_type [Numeric >= Boolean], [@numeric], true
|
29
|
-
assert_correct_type [Numeric >= Boolean], [@numeric], false
|
30
|
-
|
31
|
-
assert_correct_type [Boolean, Numeric >= Numeric], [true, @numeric], @numeric
|
32
|
-
assert_correct_type [Boolean, Array >= Array ], [true, @array ], @array
|
33
|
-
assert_correct_type [Boolean, String >= String ], [true, @string ], @string
|
34
|
-
assert_correct_type [Boolean, Hash >= Hash ], [true, @hash ], @hash
|
35
|
-
assert_correct_type [Boolean, Symbol >= Symbol ], [true, @symbol ], @symbol
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_wrong_return_type
|
39
|
-
assert_wrong_rtn [Numeric >= Numeric], [@numeric], @array
|
40
|
-
assert_wrong_rtn [Numeric >= Numeric], [@numeric], @string
|
41
|
-
assert_wrong_rtn [Numeric >= Numeric], [@numeric], @hash
|
42
|
-
assert_wrong_rtn [Numeric >= Numeric], [@numeric], @symbol
|
43
|
-
assert_wrong_rtn [Numeric >= Numeric], [@numeric], true
|
44
|
-
|
45
|
-
assert_wrong_rtn [Numeric, Numeric >= Numeric], [@numeric, @numeric], @array
|
46
|
-
assert_wrong_rtn [Numeric, Numeric >= Numeric], [@numeric, @numeric], @string
|
47
|
-
assert_wrong_rtn [Numeric, Numeric >= Numeric], [@numeric, @numeric], @hash
|
48
|
-
assert_wrong_rtn [Numeric, Numeric >= Numeric], [@numeric, @numeric], @symbol
|
49
|
-
assert_wrong_rtn [Numeric, Numeric >= Numeric], [@numeric, @numeric], true
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_wrong_args_type
|
53
|
-
assert_wrong_arg [Numeric >= Numeric], [@array ], @numeric
|
54
|
-
assert_wrong_arg [Numeric >= Numeric], [@string], @numeric
|
55
|
-
assert_wrong_arg [Numeric >= Numeric], [@hash ], @numeric
|
56
|
-
assert_wrong_arg [Numeric >= Numeric], [@symbol], @numeric
|
57
|
-
assert_wrong_arg [Numeric >= Numeric], [true ], @numeric
|
58
|
-
|
59
|
-
assert_wrong_arg [Numeric, Numeric >= Numeric], [@numeric, @array ], @numeric
|
60
|
-
assert_wrong_arg [Numeric, Numeric >= Numeric], [@numeric, @string], @numeric
|
61
|
-
assert_wrong_arg [Numeric, Numeric >= Numeric], [@numeric, @hash ], @numeric
|
62
|
-
assert_wrong_arg [Numeric, Numeric >= Numeric], [@numeric, @symbol], @numeric
|
63
|
-
assert_wrong_arg [Numeric, Numeric >= Numeric], [@numeric, true ], @numeric
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_any
|
67
|
-
assert_correct_type [Any >= Any], [@array ], @numeric
|
68
|
-
assert_correct_type [Any >= Any], [@string], @numeric
|
69
|
-
assert_correct_type [Any >= Any], [@hash ], @numeric
|
70
|
-
assert_correct_type [Any >= Any], [@symbol], @numeric
|
71
|
-
|
72
|
-
assert_correct_type [Any, Any >= Any], [@numeric, @array ], @numeric
|
73
|
-
assert_correct_type [Any, Any >= Any], [@numeric, @string], @numeric
|
74
|
-
assert_correct_type [Any, Any >= Any], [@numeric, @hash ], @numeric
|
75
|
-
assert_correct_type [Any, Any >= Any], [@numeric, @symbol], @numeric
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
def assert_equal_to_s(str, val)
|
80
|
-
assert_equal str, val.to_s
|
81
|
-
end
|
82
|
-
|
83
|
-
def assert_correct_type(type_list, args, val)
|
84
|
-
assert_equal val, define_test_method(type_list, args, val).call(*args)
|
85
|
-
end
|
86
|
-
|
87
|
-
def assert_wrong_arg(type_list, args, val)
|
88
|
-
assert_raises(ArgumentError) { define_test_method(type_list, args, val).call(*args) }
|
89
|
-
end
|
90
|
-
|
91
|
-
def assert_wrong_rtn(type_list, args, val)
|
92
|
-
assert_raises(TypeError) { define_test_method(type_list, args, val).call(*args) }
|
93
|
-
end
|
94
|
-
|
95
|
-
def define_test_method(type_list, args, val)
|
96
|
-
klass = Class.new.class_eval <<-RUBY_CODE
|
97
|
-
def call(#{arg_literal(args.count)})
|
98
|
-
#{obj_literal(val)}
|
99
|
-
end
|
100
|
-
type #{type_list.map(&:to_s).join(',')}, :call
|
101
|
-
RUBY_CODE
|
102
|
-
|
103
|
-
klass.new
|
104
|
-
end
|
105
|
-
|
106
|
-
def obj_literal(obj)
|
107
|
-
"ObjectSpace._id2ref(#{obj.__id__})"
|
108
|
-
end
|
109
|
-
|
110
|
-
def arg_literal(count)
|
111
|
-
('a'..'z').to_a[0..count-1].join(',')
|
112
|
-
end
|
113
|
-
end
|