]> git.wincent.com - walrat.git/blob - spec/parslet_repetition_spec.rb
Update to RSpec 3.1.0
[walrat.git] / spec / parslet_repetition_spec.rb
1 # Copyright 2007-2014 Greg Hurrell. All rights reserved.
2 # Licensed under the terms of the BSD 2-clause license.
3
4 require 'spec_helper'
5
6 describe Walrat::ParsletRepetition do
7   it 'raises if "parseable" argument is nil' do
8     expect do
9       Walrat::ParsletRepetition.new nil, 0
10     end.to raise_error(ArgumentError, /nil parseable/)
11   end
12
13   it 'raises if "min" argument is nil' do
14     expect do
15       Walrat::ParsletRepetition.new 'foo'.to_parseable, nil
16     end.to raise_error(ArgumentError, /nil min/)
17   end
18
19   it 'raises if passed nil string for parsing' do
20     expect do
21       Walrat::ParsletRepetition.new('foo'.to_parseable, 0).parse nil
22     end.to raise_error(ArgumentError, /nil string/)
23   end
24
25   it 'should be able to match "zero or more" times (like "*" in regular expressions)' do
26     parslet = Walrat::ParsletRepetition.new 'foo'.to_parseable, 0
27     expect do
28       parslet.parse 'bar'
29     end.to throw_symbol(:ZeroWidthParseSuccess)                   # zero times
30     parslet.parse('foo').should == 'foo'                          # one time
31     parslet.parse('foofoo').should == ['foo', 'foo']              # two times
32     parslet.parse('foofoofoobar').should == ['foo', 'foo', 'foo'] # three times
33   end
34
35   it 'should be able to match "zero or one" times (like "?" in regular expressions)' do
36     parslet = Walrat::ParsletRepetition.new 'foo'.to_parseable, 0, 1
37     expect do
38       parslet.parse 'bar'
39     end.to throw_symbol(:ZeroWidthParseSuccess) # zero times
40     parslet.parse('foo').should == 'foo'        # one time
41     parslet.parse('foofoo').should == 'foo'     # stop at one time
42   end
43
44   it 'should be able to match "one or more" times (like "+" in regular expressions)' do
45     parslet = Walrat::ParsletRepetition.new 'foo'.to_parseable, 1
46     expect do
47       parslet.parse 'bar'
48     end.to raise_error(Walrat::ParseError)                        # zero times (error)
49     parslet.parse('foo').should == 'foo'                          # one time
50     parslet.parse('foofoo').should == ['foo', 'foo']              # two times
51     parslet.parse('foofoofoobar').should == ['foo', 'foo', 'foo'] # three times
52   end
53
54   it 'should be able to match "between X and Y" times (like {X, Y} in regular expressions)' do
55     parslet = Walrat::ParsletRepetition.new 'foo'.to_parseable, 2, 3
56     expect do
57       parslet.parse 'bar'
58     end.to raise_error(Walrat::ParseError)                        # zero times (error)
59     expect do
60       parslet.parse 'foo'
61     end.to raise_error(Walrat::ParseError)                        # one time (error)
62     parslet.parse('foofoo').should == ['foo', 'foo']              # two times
63     parslet.parse('foofoofoo').should == ['foo', 'foo', 'foo']    # three times
64     parslet.parse('foofoofoofoo').should == ['foo', 'foo', 'foo'] # stop at three times
65   end
66
67   it 'matches should be greedy' do
68     # here the ParsletRepetition should consume all the "foos", leaving nothing
69     # for the final parslet
70     parslet = Walrat::ParsletRepetition.new('foo'.to_parseable, 1) & 'foo'
71     expect do
72       parslet.parse 'foofoofoofoo'
73     end.to raise_error(Walrat::ParseError)
74   end
75
76   it 'should be able to compare for equality' do
77     Walrat::ParsletRepetition.new('foo'.to_parseable, 1).
78       should eql(Walrat::ParsletRepetition.new('foo'.to_parseable, 1))
79     Walrat::ParsletRepetition.new('foo'.to_parseable, 1).
80       should_not eql(Walrat::ParsletRepetition.new('bar'.to_parseable, 1))
81     Walrat::ParsletRepetition.new('foo'.to_parseable, 1).
82       should_not eql(Walrat::ParsletRepetition.new('foo'.to_parseable, 2))
83   end
84 end