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.
@@ -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
@@ -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: