oval 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,9 @@
1
1
  2014-02-03 Pawel Tomulik <ptomulik@meil.pw.edu.pl>
2
+ * release 0.0.5
3
+ * refactored ensure_match -> validate
4
+ * added Oval::Match declarator
5
+ * fixed error message in OneOf to be more verbose
6
+ * added it_should method to declarators
2
7
  * release 0.0.4
3
8
  2014-02-02 Pawel Tomulik <ptomulik@meil.pw.edu.pl>
4
9
  * corrections to README.md
data/Modulefile CHANGED
@@ -1,5 +1,5 @@
1
1
  name 'ptomulik-oval'
2
- version '0.0.4'
2
+ version '0.0.5'
3
3
  source 'git://github.com/ptomulik/rubygems-oval.git'
4
4
  author 'ptomulik'
5
5
  license 'Apache License, Version 2.0'
data/README.md CHANGED
@@ -248,6 +248,26 @@ document all the core non-terminal declarators implemented in **Oval**.
248
248
  end
249
249
  ```
250
250
 
251
+ ####<a id="ov\_match"></a>ov\_match
252
+
253
+ - Declaration
254
+
255
+ ```ruby
256
+ ov_match[re]
257
+ ```
258
+
259
+ - Validation - permits only values matching regular expression **re**,
260
+ - Allowed values for **re** - must be a kind of `Regexp`.
261
+ - Example
262
+
263
+ ```ruby
264
+ # Only valid identifiers are allowed as :bar option
265
+ ov = ov_options[ :bar => ov_match[/^[a-z_]\w+$/] ]
266
+ def foo(ops = {})
267
+ ov.validate(ops,'ops')
268
+ end
269
+ ```
270
+
251
271
  ####<a id="ov\_one\_of"></a>ov\_one\_of
252
272
 
253
273
  - Declaration
@@ -3,6 +3,7 @@ module Oval
3
3
  require 'oval/collection'
4
4
  require 'oval/instance_of'
5
5
  require 'oval/kind_of'
6
+ require 'oval/match'
6
7
  require 'oval/one_of'
7
8
  require 'oval/options'
8
9
  require 'oval/subclass_of'
@@ -12,7 +13,13 @@ module Oval
12
13
  def ov_collection; Oval::Collection; end
13
14
  def ov_instance_of; Oval::InstanceOf; end
14
15
  def ov_kind_of; Oval::KindOf; end
16
+ def ov_match; Oval::Match; end
15
17
  def ov_one_of; Oval::OneOf; end
16
18
  def ov_options; Oval::Options; end
17
19
  def ov_subclass_of; Oval::SubclassOf; end
20
+
21
+ module_function
22
+ def validate(thing, decl, subject = nil)
23
+ Oval::Base.validate(thing, decl, subject)
24
+ end
18
25
  end
@@ -8,5 +8,6 @@ class Oval::Anything < Oval::Base
8
8
  private :new
9
9
  end
10
10
  def validate(x,subject=nil); end
11
+ def it_should; "be anything"; end
11
12
  def initialize(); end
12
13
  end
@@ -4,7 +4,11 @@ class Oval::ArrayItem < Oval::Base
4
4
 
5
5
  def validate(item, i, subject = nil)
6
6
  item_subject = subject.nil? ? nil : "#{subject}[#{i}]"
7
- self.class.ensure_match(item,item_decl,item_subject)
7
+ self.class.validate(item,item_decl,item_subject)
8
+ end
9
+
10
+ def it_should
11
+ self.class.it_should(item_decl)
8
12
  end
9
13
 
10
14
  def self.[](item_decl)
@@ -13,7 +13,7 @@ class Oval::Base
13
13
  end
14
14
  end
15
15
 
16
- def self.ensure_match(thing, decl, subject = nil)
16
+ def self.validate(thing, decl, subject = nil)
17
17
  if decl.is_a? Oval::Base
18
18
  decl.validate(thing,subject)
19
19
  else
@@ -22,6 +22,17 @@ class Oval::Base
22
22
  end
23
23
  end
24
24
 
25
+ def self.it_should(decl)
26
+ if decl.is_a? Oval::Base
27
+ decl.it_should
28
+ elsif decl == Oval::Anything
29
+ Oval::Anything[].it_should
30
+ else
31
+ # "terminal symbol"
32
+ "be equal #{decl.inspect}"
33
+ end
34
+ end
35
+
25
36
  def self.[](*args)#,subject = default_subject)
26
37
  return new(*args)
27
38
  end
@@ -30,6 +41,10 @@ class Oval::Base
30
41
  raise NotImplementedError, "This method should be overwritten by a subclass"
31
42
  end
32
43
 
44
+ def it_should()
45
+ raise NotImplementedError, "This method should be overwritten by a subclass"
46
+ end
47
+
33
48
  def initialize(*args)
34
49
  end
35
50
 
@@ -43,14 +43,17 @@ require 'oval/hash_item'
43
43
  # ```
44
44
  #
45
45
  class Oval::Collection < Oval::Base
46
-
47
46
  def validate(collection, subject = nil)
48
47
  class_subject = subject.nil? ? nil : "#{subject}.class"
49
- self.class.ensure_match(collection.class, class_decl, class_subject)
48
+ self.class.validate(collection.class, class_decl, class_subject)
50
49
  i = 0
51
50
  collection.each { |item| item_validator.validate(item, i, subject); i+= 1}
52
51
  end
53
52
 
53
+ def it_should
54
+ "be #{klass} whose item should #{self.class.it_should(item_validator)}"
55
+ end
56
+
54
57
  def self.[](class_decl,item_decl = Oval::Anything[])
55
58
  new(class_decl,item_decl)
56
59
  end
@@ -6,8 +6,13 @@ class Oval::HashItem < Oval::Base
6
6
  def validate(item, i, subject = nil)
7
7
  key_subject = subject.nil? ? nil: "#{subject} key"
8
8
  val_subject = subject.nil? ? nil: "#{subject}[#{item[0].inspect}]"
9
- self.class.ensure_match(item[0],key_decl,key_subject)
10
- self.class.ensure_match(item[1],val_decl,val_subject)
9
+ self.class.validate(item[0],key_decl,key_subject)
10
+ self.class.validate(item[1],val_decl,val_subject)
11
+ end
12
+
13
+ def it_should
14
+ "be {key => value} where key should #{self.class.it_should(key_decl)} " +
15
+ "and value should #{self.class.it_should(val_decl)}"
11
16
  end
12
17
 
13
18
  def self.[](item_decl)
@@ -8,4 +8,7 @@ class Oval::InstanceOf < Oval::ClassDeclBase
8
8
  "#{for_subject(subject)}. Should be an instance of #{klass.name}"
9
9
  end
10
10
  end
11
+ def it_should
12
+ "be an instance of #{klass.name}"
13
+ end
11
14
  end
@@ -8,4 +8,7 @@ class Oval::KindOf < Oval::ClassDeclBase
8
8
  "#{for_subject(subject)}. Should be a kind of #{klass.name}"
9
9
  end
10
10
  end
11
+ def it_should
12
+ "be a kind of #{klass.name}"
13
+ end
11
14
  end
@@ -0,0 +1,40 @@
1
+ require 'oval/base'
2
+
3
+ class Oval::Match < Oval::Base
4
+
5
+ def validate(thing, subject = nil)
6
+ unless re.match(thing)
7
+ raise Oval::ValueError,
8
+ "Invalid value #{thing.inspect}#{for_subject(subject)}. " +
9
+ "Should #{it_should}"
10
+ end
11
+ end
12
+
13
+ def it_should
14
+ "match #{re.inspect}"
15
+ end
16
+
17
+ def self.[](re)
18
+ new(re)
19
+ end
20
+
21
+ def initialize(re)
22
+ self.re = re
23
+ end
24
+
25
+ attr_reader :re
26
+
27
+ private
28
+
29
+ def re=(re)
30
+ self.class.validate_re(re)
31
+ @re = re
32
+ end
33
+
34
+ def self.validate_re(re)
35
+ unless re.is_a?(Regexp)
36
+ raise Oval::DeclError, "Invalid regular expression #{re.inspect}. " +
37
+ "Should be an instance of Regexp"
38
+ end
39
+ end
40
+ end
@@ -12,14 +12,26 @@ class Oval::OneOf < Oval::Base
12
12
  ok = false
13
13
  self.decls.each do |decl|
14
14
  begin
15
- self.class.ensure_match(thing, decl)
15
+ self.class.validate(thing, decl)
16
16
  ok = true
17
17
  break
18
18
  rescue Oval::ValueError
19
19
  end
20
20
  end
21
21
  unless ok
22
- raise Oval::ValueError, "Invalid value #{thing.inspect}#{for_subject(subject)}"
22
+ raise Oval::ValueError,
23
+ "Invalid value #{thing.inspect}#{for_subject(subject)}. " +
24
+ "Should #{self.it_should}"
25
+ end
26
+ end
27
+
28
+ def it_should
29
+ if decls.empty?
30
+ "be absent"
31
+ else
32
+ output = decls[0..-2].map{|k| self.class.it_should(k)}.join(', ')
33
+ output.empty? ? self.class.it_should(decls[0]) :
34
+ [output, self.class.it_should(decls[-1])].join(' or ')
23
35
  end
24
36
  end
25
37
 
@@ -39,7 +39,7 @@ class Oval::Options < Oval::Base
39
39
 
40
40
  def validate_option_value(value, name, subject = nil)
41
41
  subject = "#{subject}[#{name.inspect}]" if subject
42
- self.class.ensure_match(value, decl[name], subject)
42
+ self.class.validate(value, decl[name], subject)
43
43
  end
44
44
 
45
45
  def self.validate_decl(decl)
@@ -8,4 +8,7 @@ class Oval::SubclassOf < Oval::ClassDeclBase
8
8
  "Should be subclass of #{klass.name}"
9
9
  end
10
10
  end
11
+ def it_should
12
+ "be a subclass of #{klass.name}"
13
+ end
11
14
  end
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = 'oval'
6
- gem.version = '0.0.4'
6
+ gem.version = '0.0.5'
7
7
  gem.authors = ["Pawel Tomulik"]
8
8
  gem.email = ["ptomulik@meil.pw.edu.pl"]
9
9
  gem.description = %q{Validate options when passed to methods}
@@ -2,26 +2,36 @@ require 'spec_helper'
2
2
  require 'oval/anything'
3
3
  describe Oval::Anything do
4
4
  let(:subject) { described_class.instance }
5
+
6
+ it "should be subclass of Oval::Base" do
7
+ described_class.should < Oval::Base
8
+ end
9
+
5
10
  context 'the class' do
6
11
  it { described_class.should respond_to :instance }
7
12
  it { described_class.should respond_to :[] }
8
13
  it { described_class.should_not respond_to :new }
9
14
  end
15
+
10
16
  context 'an instance' do
11
17
  it { should respond_to :validate }
18
+ it { should respond_to :it_should }
12
19
  end
20
+
13
21
  describe "instance (i.e. class method called instance)" do
14
22
  it "should return singleton" do
15
23
  previous = described_class.instance
16
24
  described_class.instance.should be previous
17
25
  end
18
26
  end
27
+
19
28
  describe "[]" do
20
29
  it "should == #{described_class}.instance" do
21
30
  described_class.stubs(:instance).once.with().returns :ok
22
31
  described_class[].should be :ok
23
32
  end
24
33
  end
34
+
25
35
  describe "#validate" do
26
36
  # It should accept anything, which is quite hard to test, so I put here
27
37
  # some random stuff ...
@@ -35,4 +45,8 @@ describe Oval::Anything do
35
45
  end
36
46
  end
37
47
  end
48
+
49
+ describe "#it_should" do
50
+ its(:it_should) { should == "be anything" }
51
+ end
38
52
  end
@@ -1,14 +1,20 @@
1
- require 'spec_helper.rb'
2
- require 'oval/array_item.rb'
1
+ require 'spec_helper'
2
+ require 'oval/array_item'
3
3
 
4
4
  describe Oval::ArrayItem do
5
+ it "should be subclass of Oval::Base" do
6
+ described_class.should < Oval::Base
7
+ end
8
+
5
9
  context 'the class' do
6
10
  it { described_class.should respond_to :[] }
7
11
  end
12
+
8
13
  context 'an instance' do
9
14
  let(:subject) { described_class[:item_decl0] }
10
15
  it { should respond_to :validate }
11
16
  it { should respond_to :item_decl }
17
+ it { should respond_to :it_should }
12
18
  end
13
19
 
14
20
  describe "[]" do
@@ -44,17 +50,39 @@ describe Oval::ArrayItem do
44
50
  describe "#validate" do
45
51
  let(:subject) { described_class[:item_decl0] }
46
52
  context "validate(:item1,0)" do
47
- it 'should invoke self.class.ensure_match(:item1,:item_decl0,nil) once' do
48
- described_class.expects(:ensure_match).once.with(:item1,:item_decl0,nil)
53
+ it 'should invoke self.class.validate(:item1,:item_decl0,nil) once' do
54
+ described_class.expects(:validate).once.with(:item1,:item_decl0,nil)
49
55
  subject.validate(:item1,0)
50
56
  end
51
57
  end
52
58
  context "validate(:item1,0,'foo')" do
53
- it 'should invoke self.class.ensure_match(:item1,:item_decl0,"foo[0]") once' do
54
- described_class.expects(:ensure_match).once.with(:item1,:item_decl0,"foo[0]")
59
+ it 'should invoke self.class.validate(:item1,:item_decl0,"foo[0]") once' do
60
+ described_class.expects(:validate).once.with(:item1,:item_decl0,"foo[0]")
55
61
  subject.validate(:item1,0,'foo')
56
62
  end
57
63
  end
58
64
  end
65
+
66
+ describe "#it_should" do
67
+ [
68
+ [:foo, "be equal :foo"],
69
+ [10, "be equal 10"],
70
+ [Class.new(Oval::Base) do
71
+ def it_should
72
+ "be a test value"
73
+ end
74
+ def inspect
75
+ '<Oval::Test>'
76
+ end
77
+ end.new,
78
+ "be a test value"]
79
+ ].each do |item_decl,msg|
80
+ context "#{described_class}[#{item_decl.inspect}].it_should" do
81
+ let(:item_decl) { item_decl }
82
+ let(:msg) { msg }
83
+ it { described_class[item_decl].it_should.should == msg }
84
+ end
85
+ end
86
+ end
59
87
  end
60
88
 
@@ -5,7 +5,7 @@ describe Oval::Base do
5
5
  context "the class" do
6
6
  [
7
7
  :ensure_equal,
8
- :ensure_match,
8
+ :validate,
9
9
  :[],
10
10
  :for_subject,
11
11
  :enumerate,
@@ -23,31 +23,31 @@ describe Oval::Base do
23
23
  end
24
24
  end
25
25
 
26
- describe "ensure_match" do
27
- context "ensure_match(:foo,:bar)" do
26
+ describe "validate" do
27
+ context "validate(:foo,:bar)" do
28
28
  it "should invoke ensure_equal(:foo,:bar,nil) once" do
29
29
  described_class.expects(:ensure_equal).once.with(:foo,:bar,nil)
30
- expect { described_class.ensure_match(:foo,:bar) }.to_not raise_error
30
+ expect { described_class.validate(:foo,:bar) }.to_not raise_error
31
31
  end
32
32
  end
33
- context "ensure_match(:foo,:bar,'subj1')" do
33
+ context "validate(:foo,:bar,'subj1')" do
34
34
  it "should invoke ensure_equal(:foo,:bar,'subj1') once" do
35
35
  described_class.expects(:ensure_equal).once.with(:foo,:bar,'subj1')
36
- expect { described_class.ensure_match(:foo,:bar,'subj1') }.to_not raise_error
36
+ expect { described_class.validate(:foo,:bar,'subj1') }.to_not raise_error
37
37
  end
38
38
  end
39
- context "ensure_match(:foo,shape)" do
39
+ context "validate(:foo,shape)" do
40
40
  let(:shape) { described_class[:shape0] }
41
41
  it "should invoke shape.validate(:foo,nil) once" do
42
42
  shape.expects(:validate).once.with(:foo,nil)
43
- expect { described_class.ensure_match(:foo,shape) }.to_not raise_error
43
+ expect { described_class.validate(:foo,shape) }.to_not raise_error
44
44
  end
45
45
  end
46
- context "ensure_match(:foo,shape,'subj1')" do
46
+ context "validate(:foo,shape,'subj1')" do
47
47
  let(:shape) { described_class[:shape0] }
48
48
  it "should invoke shape.validate(:foo,'subj1') once" do
49
49
  shape.expects(:validate).once.with(:foo,'subj1')
50
- expect { described_class.ensure_match(:foo,shape,'subj1') }.to_not raise_error
50
+ expect { described_class.validate(:foo,shape,'subj1') }.to_not raise_error
51
51
  end
52
52
  end
53
53
  end
@@ -2,6 +2,11 @@ require 'spec_helper'
2
2
  require 'oval/class_decl_base'
3
3
 
4
4
  describe Oval::ClassDeclBase do
5
+
6
+ it "should be subclass of Oval::Base" do
7
+ described_class.should < Oval::Base
8
+ end
9
+
5
10
  context "the class" do
6
11
  [
7
12
  :[],
@@ -22,12 +27,6 @@ describe Oval::ClassDeclBase do
22
27
  end
23
28
 
24
29
  describe "#validate_class" do
25
- ## let(:subject) { described_class.new(:klass0) }
26
- ## before do
27
- ## described_class.stubs(:validate_class)
28
- ## subject
29
- ## described_class.unstub(:validate_class)
30
- ## end
31
30
  context "validate_class(:symbol1)" do
32
31
  let(:msg) { "Invalid class :symbol1 for ClassDeclBase" }
33
32
  it { expect { described_class.send(:validate_class,:symbol1,Oval::ClassDeclBase) }.to raise_error Oval::DeclError, msg }
@@ -5,16 +5,22 @@ require 'oval/instance_of'
5
5
  require 'oval/kind_of'
6
6
 
7
7
  describe Oval::Collection do
8
+ it "should be subclass of Oval::Base" do
9
+ described_class.should < Oval::Base
10
+ end
11
+
8
12
  describe 'the class' do
9
13
  it { described_class.should respond_to :[] }
10
14
  it { described_class.should respond_to :new }
11
15
  it { described_class.should respond_to :validate_class_decl }
12
16
  end
17
+
13
18
  describe 'an instance' do
14
19
  let(:subject) { described_class[Array,nil] }
15
20
  it { should respond_to :validate }
16
21
  it { should respond_to :class_decl }
17
22
  it { should respond_to :item_decl }
23
+ it { should respond_to :it_should }
18
24
  end
19
25
 
20
26
  describe "[]" do
@@ -74,33 +80,6 @@ describe Oval::Collection do
74
80
  end
75
81
  end
76
82
 
77
- ## describe "validate_item_decl" do
78
- ## [
79
- ## [Hash, "Hash"],
80
- ## [Class.new(Hash), "Class.new(Hash)" ],
81
- ## ].each do |class_decl,class_desc|
82
- ## context "validate_item_decl(:decl1, #{class_desc})" do
83
- ## let(:class_decl) { class_decl }
84
- ## it "should invoke validate_hash_item_decl(:decl1) once" do
85
- ## described_class.stubs(:validate_hash_item_decl).once.with(:decl1)
86
- ## expect { described_class.validate_item_decl(:decl1,class_decl) }.to_not raise_error
87
- ## end
88
- ## end
89
- ## end
90
- ## [
91
- ## [Array, "Array"],
92
- ## [Class.new(Array), "Class.new(Array)" ],
93
- ## ].each do |class_decl,class_desc|
94
- ## context "validate_item_decl(:decl1, #{class_desc})" do
95
- ## let(:class_decl) { class_decl }
96
- ## it "should not invoke validate_hash_item_decl(:decl1)" do
97
- ## described_class.stubs(:validate_hash_item_decl).never
98
- ## expect { described_class.validate_item_decl(:decl1,class_decl) }.to_not raise_error
99
- ## end
100
- ## end
101
- ## end
102
- ## end
103
-
104
83
  describe "#class_decl" do
105
84
  before do
106
85
  described_class.stubs(:validate_class_decl)
@@ -254,4 +233,25 @@ describe Oval::Collection do
254
233
  end
255
234
  end
256
235
  end
236
+
237
+ describe "#it_should" do
238
+ [
239
+ [ [Array,Oval::Anything],
240
+ "be Array whose item should be anything" ],
241
+ [ [Array,nil],
242
+ "be Array whose item should be equal nil"],
243
+ [ [Array, Oval::InstanceOf[Fixnum]],
244
+ "be Array whose item should be an instance of Fixnum"],
245
+ [ [Hash, {:foo => :bar}],
246
+ "be Hash whose item should be {key => value} where key should be equal :foo and value should be equal :bar"],
247
+ [ [Hash, {Oval::InstanceOf[Symbol] => Oval::KindOf[Numeric]}],
248
+ "be Hash whose item should be {key => value} where key should be an instance of Symbol and value should be a kind of Numeric"],
249
+ ].each do |decls,msg|
250
+ context "#{described_class.name}[#{decls.map{|x| x.inspect}.join(', ')}].it_should" do
251
+ let(:decls) { decls }
252
+ let(:msg) { msg }
253
+ it { described_class[*decls].it_should.should == msg}
254
+ end
255
+ end
256
+ end
257
257
  end
@@ -4,16 +4,22 @@ require 'oval/instance_of'
4
4
  require 'oval/kind_of'
5
5
 
6
6
  describe Oval::HashItem do
7
+ it "should be subclass of Oval::Base" do
8
+ described_class.should < Oval::Base
9
+ end
10
+
7
11
  context 'the class' do
8
12
  it { described_class.should respond_to :[] }
9
13
  it { described_class.should respond_to :validate_item_decl }
10
14
  end
15
+
11
16
  context 'an instance' do
12
17
  let(:subject) { described_class[{:key_decl0 => :val_decl0}] }
13
18
  it { should respond_to :validate }
14
19
  it { should respond_to :key_decl }
15
20
  it { should respond_to :val_decl }
16
21
  it { subject.private_methods.map{|m| m.is_a?(Symbol) ? m : m.intern}.should include :item_decl= }
22
+ it { should respond_to :it_should }
17
23
  end
18
24
 
19
25
  describe "[]" do
@@ -143,4 +149,39 @@ describe Oval::HashItem do
143
149
  end
144
150
  end
145
151
  end
152
+
153
+ describe "#it_should" do
154
+ [
155
+ [{:foo => :bar}, 'be equal :foo', 'be equal :bar' ],
156
+ [{'x' => 10}, 'be equal "x"', 'be equal 10' ],
157
+ [
158
+ {
159
+ Class.new(Oval::Base) do
160
+ def it_should
161
+ 'be the test1 value'
162
+ end
163
+ def inspect
164
+ 'Oval::Test1'
165
+ end
166
+ end.new =>
167
+ Class.new(Oval::Base) do
168
+ def it_should
169
+ 'be the test2 value'
170
+ end
171
+ def inspect
172
+ 'Oval::Test2'
173
+ end
174
+ end.new
175
+ },
176
+ 'be the test1 value',
177
+ 'be the test2 value',
178
+ ]
179
+ ].each do |item_decl,key_should, val_should|
180
+ context "#{described_class}[#{item_decl.inspect}].it_should" do
181
+ let(:item_decl) { item_decl }
182
+ let(:msg) { "be {key => value} where key should #{key_should} and value should #{val_should}" }
183
+ it { described_class[item_decl].it_should.should == msg }
184
+ end
185
+ end
186
+ end
146
187
  end
@@ -2,10 +2,15 @@ require 'spec_helper'
2
2
  require 'oval/instance_of'
3
3
 
4
4
  describe Oval::InstanceOf do
5
+ it "should be subclass of Oval::ClassDeclBase" do
6
+ described_class.should < Oval::ClassDeclBase
7
+ end
8
+
5
9
  describe 'an instance' do
6
10
  let(:subject) { described_class[:klass] }
7
11
  before { described_class.stubs(:validate_class) }
8
12
  it { should respond_to :validate }
13
+ it { should respond_to :it_should }
9
14
  end
10
15
 
11
16
  context "#{described_class.name}[:symbol1]" do
@@ -41,4 +46,13 @@ describe Oval::InstanceOf do
41
46
  end
42
47
  end
43
48
  end
49
+
50
+ describe "#it_should" do
51
+ [ String, NilClass, Numeric ].each do |klass|
52
+ context "#{described_class.name}[#{klass.name}].it_should" do
53
+ let(:klass) { klass }
54
+ it { described_class[klass].it_should.should == "be an instance of #{klass.name}"}
55
+ end
56
+ end
57
+ end
44
58
  end
@@ -2,10 +2,15 @@ require 'spec_helper'
2
2
  require 'oval/kind_of'
3
3
 
4
4
  describe Oval::KindOf do
5
+ it "should be subclass of Oval::ClassDeclBase" do
6
+ described_class.should < Oval::ClassDeclBase
7
+ end
8
+
5
9
  describe 'an instance' do
6
10
  let(:subject) { described_class[:klass] }
7
11
  before { described_class.stubs(:validate_class) }
8
12
  it { should respond_to :validate }
13
+ it { should respond_to :it_should }
9
14
  end
10
15
 
11
16
  context "#{described_class.name}[:symbol1]" do
@@ -42,4 +47,13 @@ describe Oval::KindOf do
42
47
  end
43
48
  end
44
49
  end
50
+
51
+ describe "#it_should" do
52
+ [ String, NilClass, Numeric ].each do |klass|
53
+ context "#{described_class.name}[#{klass.name}].it_should" do
54
+ let(:klass) { klass }
55
+ it { described_class[klass].it_should.should == "be a kind of #{klass.name}"}
56
+ end
57
+ end
58
+ end
45
59
  end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+ require 'oval/match'
3
+
4
+ describe Oval::Match do
5
+ it "should be subclass of Oval::Base" do
6
+ described_class.should < Oval::Base
7
+ end
8
+
9
+ context 'the class' do
10
+ it { described_class.should respond_to :[] }
11
+ end
12
+
13
+ context 'an instance' do
14
+ let(:subject) { described_class[:re0] }
15
+ before { described_class.stubs(:validate_re).with(:re0) }
16
+ it { should respond_to :validate }
17
+ it { should respond_to :re }
18
+ it { should respond_to :it_should }
19
+ end
20
+
21
+ describe "[]" do
22
+ context "#{described_class.name}[:re0]" do
23
+ it "should == new(:re0)" do
24
+ described_class.stubs(:new).once.with(:re0).returns :ok
25
+ described_class[:re0].should be :ok
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "re" do
31
+ let(:subject) { described_class[:re0] }
32
+ before { described_class.stubs(:validate_re).with(:re0) }
33
+ context "#{described_class.name}[:re0].re" do
34
+ it { subject.re.should be :re0 }
35
+ end
36
+ context "when @re = :re1" do
37
+ before { subject.instance_variable_set(:@re, :re1) }
38
+ it { subject.re.should be :re1 }
39
+ end
40
+ end
41
+
42
+ describe "re=" do
43
+ let(:subject) { described_class[:re0] }
44
+ before { described_class.stubs(:validate_re).with(:re0) }
45
+ context "re = :re1" do
46
+ it "should invoke self.class.validate_re(:re1) once" do
47
+ described_class.expects(:validate_re).once.with(:re1)
48
+ expect { subject.send(:re=, :re1) }.to_not raise_error
49
+ end
50
+ it "should assign @re = :re1" do
51
+ described_class.stubs(:validate_re).with(:re1)
52
+ subject.send(:re=, :re1)
53
+ subject.instance_variable_get(:@re).should be :re1
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "validate_re" do
59
+ context "#{described_class.name}.validate_re(:re1)" do
60
+ let(:msg) { "Invalid regular expression :re1. Should be an instance of Regexp" }
61
+ it { expect { described_class.validate_re(:re1) }.to raise_error Oval::DeclError, msg }
62
+ end
63
+ context "#{described_class.name}.validate_re(/^.*$/)" do
64
+ it { expect { described_class.validate_re(/^.*$/) }.to_not raise_error }
65
+ end
66
+ end
67
+
68
+ describe "#validate" do
69
+ # Valid
70
+ [
71
+ [/.*/, ['foo']],
72
+ [/.*/, ['foo','subj']],
73
+ [/^[a-z_][a-z0-9_]+/, ['_123a','subj']]
74
+ ].each do |re,args|
75
+ context "#{described_class.name}[#{re.inspect}].validate(#{args.map{|x| x.inspect}.join(', ')})" do
76
+ let(:re) { re }
77
+ let(:args) { args }
78
+ it { expect { described_class[re].validate(*args) }.to_not raise_error }
79
+ end
80
+ end
81
+ # Validation error
82
+ [
83
+ [ /^[a-z_][a-z0-9_]+/, ['5643'], "Invalid value \"5643\". Should match #{(/^[a-z_][a-z0-9_]+/).inspect}" ],
84
+ [ /^[a-z_][a-z0-9_]+/, ['5643','subj'], "Invalid value \"5643\" for subj. Should match #{(/^[a-z_][a-z0-9_]+/).inspect}" ],
85
+ [ /^[a-z_][a-z0-9_]+/, [nil,'subj'], "Invalid value nil for subj. Should match #{(/^[a-z_][a-z0-9_]+/).inspect}" ]
86
+ ].each do |re,args,msg|
87
+ context "#{described_class.name}[#{re.inspect}].validate(#{args.map{|x| x.inspect}.join(', ')})" do
88
+ let(:re) { re }
89
+ let(:args) { args }
90
+ let(:msg) { msg }
91
+ it { expect { described_class[re].validate(*args) }.to raise_error Oval::ValueError, msg }
92
+ end
93
+ end
94
+ end
95
+
96
+ describe "#it_should" do
97
+ [ //, /^.*$/, /^[a-z_][a-z0-9_]+$/].each do |re|
98
+ context "#{described_class}[#{re.inspect}].it_should" do
99
+ let(:re) { re }
100
+ let(:msg) { "match #{re.inspect}" }
101
+ it { described_class[re].it_should.should == msg }
102
+ end
103
+ end
104
+ end
105
+ end
@@ -2,11 +2,17 @@ require 'spec_helper'
2
2
  require 'oval/one_of'
3
3
 
4
4
  describe Oval::OneOf do
5
+ it "should be subclass of Oval::Base" do
6
+ described_class.should < Oval::Base
7
+ end
8
+
5
9
  context 'the class' do
6
10
  it { described_class.should respond_to :[] }
7
11
  end
12
+
8
13
  context 'an instance' do
9
14
  it { should respond_to :validate }
15
+ it { should respond_to :it_should }
10
16
  it { should respond_to :decls }
11
17
  end
12
18
 
@@ -47,9 +53,9 @@ describe Oval::OneOf do
47
53
  end
48
54
  end
49
55
  [
50
- [ [:foo ], [:bar], "Invalid value :bar" ],
51
- [ [:foo, :bar], [:geez], "Invalid value :geez" ],
52
- [ [:foo, :bar], [:geez,'subj'], "Invalid value :geez for subj" ],
56
+ [ [:foo ], [:bar], "Invalid value :bar. Should be equal :foo" ],
57
+ [ [:foo, :bar], [:geez], "Invalid value :geez. Should be equal :foo or be equal :bar" ],
58
+ [ [:foo, :bar], [:geez,'subj'], "Invalid value :geez for subj. Should be equal :foo or be equal :bar" ],
53
59
  ].each do |decls,args,msg|
54
60
  context "#{described_class}[#{decls.map{|x| x.inspect}.join(', ')}].validate(#{args.map{|x| x.inspect}.join(', ')})" do
55
61
  let(:args) { args }
@@ -59,4 +65,19 @@ describe Oval::OneOf do
59
65
  end
60
66
  end
61
67
  end
68
+
69
+ describe "#it_should" do
70
+ [
71
+ [ [], "be absent" ],
72
+ [ [:foo], "be equal :foo"],
73
+ [ [:foo, :bar], "be equal :foo or be equal :bar"],
74
+ [ [:foo, :bar, :geez], "be equal :foo, be equal :bar or be equal :geez"],
75
+ ].each do |decls,msg|
76
+ context "#{described_class.name}[#{decls.map{|x| x.inspect}.join(', ')}].it_should" do
77
+ let(:decls) { decls }
78
+ let(:msg) { msg }
79
+ it { described_class[*decls].it_should.should == msg}
80
+ end
81
+ end
82
+ end
62
83
  end
@@ -2,6 +2,10 @@ require 'spec_helper'
2
2
  require 'oval/options'
3
3
 
4
4
  describe Oval::Options do
5
+ it "should be subclass of Oval::Base" do
6
+ described_class.should < Oval::Base
7
+ end
8
+
5
9
  context "the class" do
6
10
  [
7
11
  :validate_decl,
@@ -140,8 +144,8 @@ describe Oval::Options do
140
144
  let(:subject) { described_class[decl] }
141
145
  context "validate_option_value(#{args.map{|x| x.inspect}.join(', ')})" do
142
146
  let(:name) { name }
143
- it "should invoke self.class.ensure_match(#{args2.map{|x| x.inspect}.join(', ')}) once" do
144
- described_class.stubs(:ensure_match).once.with(*args2)
147
+ it "should invoke self.class.validate(#{args2.map{|x| x.inspect}.join(', ')}) once" do
148
+ described_class.stubs(:validate).once.with(*args2)
145
149
  expect { subject.send(:validate_option_value,*args) }.to_not raise_error
146
150
  end
147
151
  end
@@ -6,6 +6,7 @@ describe Oval::SubclassOf do
6
6
  it "should be subclass of Oval::ClassDeclBase" do
7
7
  described_class.should < Oval::ClassDeclBase
8
8
  end
9
+
9
10
  describe "#validate" do
10
11
  [
11
12
  [Integer,[Fixnum]],
@@ -31,4 +32,13 @@ describe Oval::SubclassOf do
31
32
  end
32
33
  end
33
34
  end
35
+
36
+ describe "#it_should" do
37
+ [ String, NilClass, Numeric ].each do |klass|
38
+ context "#{described_class.name}[#{klass.name}].it_should" do
39
+ let(:klass) { klass }
40
+ it { described_class[klass].it_should.should == "be a subclass of #{klass.name}"}
41
+ end
42
+ end
43
+ end
34
44
  end
@@ -9,6 +9,7 @@ describe Oval do
9
9
  it { should respond_to :ov_collection }
10
10
  it { should respond_to :ov_instance_of }
11
11
  it { should respond_to :ov_kind_of }
12
+ it { should respond_to :ov_match }
12
13
  it { should respond_to :ov_one_of }
13
14
  it { should respond_to :ov_options }
14
15
  it { should respond_to :ov_subclass_of }
@@ -18,9 +19,25 @@ describe Oval do
18
19
  its(:ov_collection) { should be Oval::Collection }
19
20
  its(:ov_instance_of) { should be Oval::InstanceOf }
20
21
  its(:ov_kind_of) { should be Oval::KindOf }
22
+ its(:ov_match) { should be Oval::Match }
21
23
  its(:ov_one_of) { should be Oval::OneOf }
22
24
  its(:ov_options) { should be Oval::Options }
23
25
  its(:ov_subclass_of) { should be Oval::SubclassOf }
26
+
27
+ describe "validate" do
28
+ context "#{described_class.name}.validate(:foo,:bar)" do
29
+ it "should invoke Oval::Base.validate(:foo,:bar,nil) once" do
30
+ Oval::Base.expects(:validate).once.with(:foo,:bar,nil)
31
+ expect { described_class.validate(:foo,:bar) }.to_not raise_error
32
+ end
33
+ end
34
+ context "#{described_class.name}.validate(:foo,:bar,'subj')" do
35
+ it "should invoke Oval::Base.validate(:foo,:bar,'subj') once" do
36
+ Oval::Base.expects(:validate).once.with(:foo,:bar,'subj')
37
+ expect { described_class.validate(:foo,:bar,'subj') }.to_not raise_error
38
+ end
39
+ end
40
+ end
24
41
  end
25
42
 
26
43
  # examples from README.md and other sources
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oval
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -168,6 +168,7 @@ files:
168
168
  - lib/oval/hash_item.rb
169
169
  - lib/oval/instance_of.rb
170
170
  - lib/oval/kind_of.rb
171
+ - lib/oval/match.rb
171
172
  - lib/oval/one_of.rb
172
173
  - lib/oval/options.rb
173
174
  - lib/oval/subclass_of.rb
@@ -181,6 +182,7 @@ files:
181
182
  - spec/unit/oval/hash_item_spec.rb
182
183
  - spec/unit/oval/instance_of_spec.rb
183
184
  - spec/unit/oval/kind_of_spec.rb
185
+ - spec/unit/oval/match_spec.rb
184
186
  - spec/unit/oval/one_of_spec.rb
185
187
  - spec/unit/oval/options_spec.rb
186
188
  - spec/unit/oval/subclass_of_spec.rb
@@ -200,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
200
202
  version: '0'
201
203
  segments:
202
204
  - 0
203
- hash: 1914845513131623040
205
+ hash: 2837400115143885778
204
206
  required_rubygems_version: !ruby/object:Gem::Requirement
205
207
  none: false
206
208
  requirements:
@@ -209,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
211
  version: '0'
210
212
  segments:
211
213
  - 0
212
- hash: 1914845513131623040
214
+ hash: 2837400115143885778
213
215
  requirements: []
214
216
  rubyforge_project:
215
217
  rubygems_version: 1.8.23
@@ -228,6 +230,7 @@ test_files:
228
230
  - spec/unit/oval/hash_item_spec.rb
229
231
  - spec/unit/oval/instance_of_spec.rb
230
232
  - spec/unit/oval/kind_of_spec.rb
233
+ - spec/unit/oval/match_spec.rb
231
234
  - spec/unit/oval/one_of_spec.rb
232
235
  - spec/unit/oval/options_spec.rb
233
236
  - spec/unit/oval/subclass_of_spec.rb