neuroncheck 0.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.
- checksums.yaml +7 -0
- data/Rakefile.rb +54 -0
- data/lib/neuroncheck.rb +1 -0
- data/lib/neuroncheck/builtin_keyword.rb +165 -0
- data/lib/neuroncheck/cond_block.rb +42 -0
- data/lib/neuroncheck/declaration.rb +295 -0
- data/lib/neuroncheck/error.rb +13 -0
- data/lib/neuroncheck/kernel.rb +618 -0
- data/lib/neuroncheck/matcher.rb +245 -0
- data/lib/neuroncheck/plugin.rb +149 -0
- data/lib/neuroncheck/syntax.rb +49 -0
- data/lib/neuroncheck/utils.rb +92 -0
- data/lib/neuroncheck/version.rb +3 -0
- data/test/test_advanced_syntactical.rb +125 -0
- data/test/test_inheritance.rb +153 -0
- data/test/test_main.rb +943 -0
- data/test/test_main_syntax.rb +237 -0
- data/test/test_plugin.rb +88 -0
- metadata +105 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib')
|
2
|
+
require 'test/unit'
|
3
|
+
require 'neuroncheck'
|
4
|
+
using NeuronCheckSyntax
|
5
|
+
|
6
|
+
# NeuronCheckSyntaxの標準テスト
|
7
|
+
class SyntaxStandardTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
test 'standard syntax use' do
|
10
|
+
cls = Class.new
|
11
|
+
cls.class_eval do
|
12
|
+
ndecl String
|
13
|
+
def met1(val)
|
14
|
+
return 'ABC'
|
15
|
+
end
|
16
|
+
|
17
|
+
ndecl String => String
|
18
|
+
def met2(val)
|
19
|
+
return 'A'
|
20
|
+
end
|
21
|
+
|
22
|
+
ndecl String => String
|
23
|
+
def met2_invalid(val)
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
|
27
|
+
ndecl any
|
28
|
+
def met3_any(val)
|
29
|
+
return nil
|
30
|
+
end
|
31
|
+
|
32
|
+
ndecl except(nil)
|
33
|
+
def met4_not_nil(val)
|
34
|
+
return nil
|
35
|
+
end
|
36
|
+
|
37
|
+
ndecl [] => nil
|
38
|
+
def met5_no_arg
|
39
|
+
return nil
|
40
|
+
end
|
41
|
+
|
42
|
+
ndecl [] => :self
|
43
|
+
def met6_returns_self(passed)
|
44
|
+
return passed
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
instance = cls.new
|
49
|
+
assert_nothing_raised{ instance.met1('A') }
|
50
|
+
assert_raise(NeuronCheckError){ instance.met1(nil) }
|
51
|
+
assert_nothing_raised{ instance.met2('A') }
|
52
|
+
assert_raise(NeuronCheckError){ instance.met2(nil) }
|
53
|
+
assert_raise(NeuronCheckError){ instance.met2_invalid('A') }
|
54
|
+
assert_nothing_raised{ instance.met3_any(nil) }
|
55
|
+
|
56
|
+
assert_raise(NeuronCheckError){ instance.met4_not_nil(nil) }
|
57
|
+
assert_nothing_raised{ instance.met4_not_nil(1) }
|
58
|
+
assert_nothing_raised{ instance.met5_no_arg }
|
59
|
+
|
60
|
+
assert_raise(NeuronCheckError){ instance.met6_returns_self(1) }
|
61
|
+
assert_raise(NeuronCheckError){ instance.met6_returns_self(cls.new) }
|
62
|
+
assert_nothing_raised{ instance.met6_returns_self(instance) }
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
# トップレベルでもなく、モジュールでもクラスでもない場所でndeclを使ったらエラー
|
67
|
+
test 'ndecl is usable only in module or toplevel' do
|
68
|
+
assert_raise do
|
69
|
+
Object.new.instance_eval do
|
70
|
+
ndecl
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
assert_raise do
|
75
|
+
cls = Class.new do
|
76
|
+
def test_met
|
77
|
+
ndecl
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
cls.new.test_met
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# ブロックの不正宣言エラーが同じように発生するかのチェック
|
86
|
+
test 'invalid block argument decl' do
|
87
|
+
assert_raise_message(/`block' of `#method_arg0' is block argument/) do
|
88
|
+
Class.new do
|
89
|
+
ndecl {
|
90
|
+
args String
|
91
|
+
}
|
92
|
+
def method_arg0(&block)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
assert_raise_message(/`block' of `#method_arg0' is block argument/) do
|
98
|
+
Class.new do
|
99
|
+
ndecl {
|
100
|
+
args String, String
|
101
|
+
}
|
102
|
+
def method_arg0(v1, &block)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# 継承時のチェック_Syntax版
|
110
|
+
class InheritanceWithSyntaxTest < Test::Unit::TestCase
|
111
|
+
def setup
|
112
|
+
parent_cls = Class.new do
|
113
|
+
|
114
|
+
ndecl /a/ => /A/
|
115
|
+
def test1(name, ret)
|
116
|
+
ret
|
117
|
+
end
|
118
|
+
|
119
|
+
ndecl /c/ => /C/
|
120
|
+
def test2_only_parent(name, ret)
|
121
|
+
ret
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
ndecl {
|
126
|
+
precond do
|
127
|
+
assert{arg1 =~ /a/}
|
128
|
+
end
|
129
|
+
|
130
|
+
postcond do |ret|
|
131
|
+
assert{ret =~ /A/}
|
132
|
+
end
|
133
|
+
}
|
134
|
+
def cond_test1(arg1, ret1)
|
135
|
+
ret1
|
136
|
+
end
|
137
|
+
|
138
|
+
ndecl String
|
139
|
+
attr_accessor :attr1
|
140
|
+
end
|
141
|
+
|
142
|
+
child_cls = Class.new(parent_cls) do
|
143
|
+
|
144
|
+
ndecl /b/ => /B/
|
145
|
+
def test1(name, ret = 'ABC')
|
146
|
+
super
|
147
|
+
|
148
|
+
ret
|
149
|
+
end
|
150
|
+
|
151
|
+
ndecl {
|
152
|
+
precond do
|
153
|
+
assert{ arg1 =~ /b/ }
|
154
|
+
end
|
155
|
+
|
156
|
+
postcond do |ret|
|
157
|
+
assert{ ret =~ /B/ }
|
158
|
+
end
|
159
|
+
}
|
160
|
+
def cond_test1(arg1, ret1 = 'ABC')
|
161
|
+
super
|
162
|
+
|
163
|
+
ret1
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
@parent_inst = parent_cls.new
|
168
|
+
@inst = child_cls.new
|
169
|
+
end
|
170
|
+
|
171
|
+
# 親の引数チェックを引き継ぐ
|
172
|
+
test 'arguments check inherited by superclass' do
|
173
|
+
assert_raise(NeuronCheckError){ @inst.test1(nil) }
|
174
|
+
assert_raise(NeuronCheckError){ @inst.test1('') }
|
175
|
+
assert_raise(NeuronCheckError){ @inst.test1('a123') }
|
176
|
+
assert_raise(NeuronCheckError){ @inst.test1('b123') }
|
177
|
+
assert_nothing_raised{ @inst.test1('a123b') }
|
178
|
+
end
|
179
|
+
|
180
|
+
# 親の引数チェックを引き継ぐ (子で再定義されていない場合)
|
181
|
+
test 'arguments check inherited by superclass (without child overridding)' do
|
182
|
+
assert_raise(NeuronCheckError){ @inst.test2_only_parent('c', 10) }
|
183
|
+
assert_raise(NeuronCheckError){ @inst.test2_only_parent('a', 'C') }
|
184
|
+
assert_nothing_raised{ @inst.test2_only_parent('c', 'C') }
|
185
|
+
end
|
186
|
+
|
187
|
+
# 親の戻り値チェックを引き継ぐ
|
188
|
+
test 'results check inherited by superclass' do
|
189
|
+
assert_raise(NeuronCheckError){ @inst.test1('ab', 'AC') }
|
190
|
+
assert_raise(NeuronCheckError){ @inst.test1('ab', 'BC') }
|
191
|
+
assert_nothing_raised{ @inst.test1('ab', 'aaABC') }
|
192
|
+
end
|
193
|
+
# 親の事前条件チェックを引き継ぐ
|
194
|
+
test 'precond check inherited by superclass' do
|
195
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1(nil) }
|
196
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1('') }
|
197
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1('a123') }
|
198
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1('b123') }
|
199
|
+
assert_nothing_raised{ @inst.cond_test1('a123b') }
|
200
|
+
end
|
201
|
+
|
202
|
+
# 親の事後条件チェックを引き継ぐ
|
203
|
+
test 'postcond check inherited by superclass' do
|
204
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1('ab', 'AC') }
|
205
|
+
assert_raise(NeuronCheckError){ @inst.cond_test1('ab', 'BC') }
|
206
|
+
assert_nothing_raised{ @inst.cond_test1('ab', 'aaABC') }
|
207
|
+
end
|
208
|
+
|
209
|
+
# 親の属性チェックを引き継ぐ
|
210
|
+
test 'attribute check inherited by superclass' do
|
211
|
+
assert_raise(NeuronCheckError){ @inst.attr1 = 30 }
|
212
|
+
assert_nothing_raised{ @inst.attr1 = '1s' }
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# 親と子でそれぞれ別々にextendした場合_Syntax版
|
217
|
+
class InheritanceOtherExtendWithSyntaxTest < Test::Unit::TestCase
|
218
|
+
|
219
|
+
# 親のみextend
|
220
|
+
test 'extend only Parent' do
|
221
|
+
par_cls = Class.new do
|
222
|
+
ndecl String
|
223
|
+
def foo_method(str1)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
chd_cls = Class.new(par_cls) do
|
228
|
+
ndecl String
|
229
|
+
def bar_method(str2)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
chd = chd_cls.new
|
234
|
+
assert_raise(NeuronCheckError){ chd.foo_method(1) }
|
235
|
+
assert_raise(NeuronCheckError){ chd.bar_method(2) }
|
236
|
+
end
|
237
|
+
end
|
data/test/test_plugin.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '../lib')
|
2
|
+
require 'test/unit'
|
3
|
+
require 'neuroncheck'
|
4
|
+
|
5
|
+
class KeywordPluginTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
NeuronCheckSystem::Plugin.add_keyword(:boolean) do
|
8
|
+
def on_call
|
9
|
+
end
|
10
|
+
|
11
|
+
def match?(value)
|
12
|
+
value.equal?(true) or value.equal?(false)
|
13
|
+
end
|
14
|
+
|
15
|
+
def expected_caption
|
16
|
+
"boolean value"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
NeuronCheckSystem::Plugin.add_keyword(:sized_array) do
|
21
|
+
def on_call(size)
|
22
|
+
@expected_size = size
|
23
|
+
end
|
24
|
+
|
25
|
+
def match?(value)
|
26
|
+
value.kind_of?(Array) and value.size == @expected_size
|
27
|
+
end
|
28
|
+
|
29
|
+
def expected_caption
|
30
|
+
"#{@expected_size} items array"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown
|
36
|
+
NeuronCheckSystem::Plugin.remove_keyword(:boolean)
|
37
|
+
NeuronCheckSystem::Plugin.remove_keyword(:sized_array)
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
test "usable added keyword (boolean)" do
|
42
|
+
cls = Class.new do
|
43
|
+
extend NeuronCheck
|
44
|
+
|
45
|
+
ndecl {
|
46
|
+
args boolean
|
47
|
+
}
|
48
|
+
|
49
|
+
def test_method(flag = false)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
inst = cls.new
|
54
|
+
assert_nothing_raised{ inst.test_method }
|
55
|
+
assert_nothing_raised{ inst.test_method(false) }
|
56
|
+
assert_nothing_raised{ inst.test_method(true) }
|
57
|
+
assert_raise_message(/must be boolean value/){ inst.test_method('1') }
|
58
|
+
end
|
59
|
+
|
60
|
+
test "usable added keyword (sized_array)" do
|
61
|
+
cls = Class.new do
|
62
|
+
extend NeuronCheck
|
63
|
+
|
64
|
+
ndecl {
|
65
|
+
args sized_array(3)
|
66
|
+
}
|
67
|
+
|
68
|
+
def test_method(tags)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
inst = cls.new
|
73
|
+
assert_nothing_raised{ inst.test_method(['a', 'b', 'c']) }
|
74
|
+
assert_raise_message(/must be 3 items array/){ inst.test_method(nil) }
|
75
|
+
assert_raise_message(/must be 3 items array/){ inst.test_method(['1']) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
class InvalidKeywordTest < Test::Unit::TestCase
|
81
|
+
|
82
|
+
test "builtin keyword cannot be overriden" do
|
83
|
+
assert_raise(NeuronCheckSystem::PluginError){
|
84
|
+
NeuronCheckSystem::Plugin.add_keyword(:array_of) do
|
85
|
+
end
|
86
|
+
}
|
87
|
+
end
|
88
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: neuroncheck
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dice
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: test-unit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- tetradice@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- Rakefile.rb
|
63
|
+
- lib/neuroncheck.rb
|
64
|
+
- lib/neuroncheck/builtin_keyword.rb
|
65
|
+
- lib/neuroncheck/cond_block.rb
|
66
|
+
- lib/neuroncheck/declaration.rb
|
67
|
+
- lib/neuroncheck/error.rb
|
68
|
+
- lib/neuroncheck/kernel.rb
|
69
|
+
- lib/neuroncheck/matcher.rb
|
70
|
+
- lib/neuroncheck/plugin.rb
|
71
|
+
- lib/neuroncheck/syntax.rb
|
72
|
+
- lib/neuroncheck/utils.rb
|
73
|
+
- lib/neuroncheck/version.rb
|
74
|
+
- test/test_advanced_syntactical.rb
|
75
|
+
- test/test_inheritance.rb
|
76
|
+
- test/test_main.rb
|
77
|
+
- test/test_main_syntax.rb
|
78
|
+
- test/test_plugin.rb
|
79
|
+
homepage: http://ruby.morphball.net/neuroncheck/
|
80
|
+
licenses:
|
81
|
+
- MIT
|
82
|
+
metadata: {}
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 2.4.7
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: Library for checking parameters, return value, preconditions and postconditions
|
103
|
+
with declarative syntax
|
104
|
+
test_files: []
|
105
|
+
has_rdoc:
|