oval 0.0.4 → 0.0.5

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