]> git.wincent.com - walrat.git/blob - spec/string_enumerator_spec.rb
Update copyright and authorship info
[walrat.git] / spec / string_enumerator_spec.rb
1 # encoding: utf-8
2 # Copyright 2007-2014 Greg Hurrell. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are met:
5 #
6 # 1. Redistributions of source code must retain the above copyright notice,
7 #    this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright notice,
9 #    this list of conditions and the following disclaimer in the documentation
10 #    and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22 # POSSIBILITY OF SUCH DAMAGE.
23
24 require File.expand_path('spec_helper', File.dirname(__FILE__))
25
26 describe Walrat::StringEnumerator do
27   it 'raises an ArgumentError if initialized with nil' do
28     expect do
29       Walrat::StringEnumerator.new nil
30     end.to raise_error(ArgumentError, /nil string/)
31   end
32
33   it 'returns characters one by one until end of string, then return nil' do
34     enumerator = Walrat::StringEnumerator.new('hello')
35     enumerator.next.should == 'h'
36     enumerator.next.should == 'e'
37     enumerator.next.should == 'l'
38     enumerator.next.should == 'l'
39     enumerator.next.should == 'o'
40     enumerator.next.should be_nil
41   end
42
43   it 'is Unicode-aware (UTF-8)' do
44     enumerator = Walrat::StringEnumerator.new('€ cañon')
45     enumerator.next.should == '€'
46     enumerator.next.should == ' '
47     enumerator.next.should == 'c'
48     enumerator.next.should == 'a'
49     enumerator.next.should == 'ñ'
50     enumerator.next.should == 'o'
51     enumerator.next.should == 'n'
52     enumerator.next.should be_nil
53   end
54
55   # this was a bug
56   it 'continues past newlines' do
57     enumerator = Walrat::StringEnumerator.new("hello\nworld")
58     enumerator.next.should == 'h'
59     enumerator.next.should == 'e'
60     enumerator.next.should == 'l'
61     enumerator.next.should == 'l'
62     enumerator.next.should == 'o'
63     enumerator.next.should == "\n" # was returning nil here
64     enumerator.next.should == 'w'
65     enumerator.next.should == 'o'
66     enumerator.next.should == 'r'
67     enumerator.next.should == 'l'
68     enumerator.next.should == 'd'
69   end
70
71   it 'can recall the last character using the "last" method' do
72     enumerator = Walrat::StringEnumerator.new('h€llo')
73     enumerator.last.should == nil # nothing scanned yet
74     enumerator.next.should == 'h' # advance
75     enumerator.last.should == nil # still no previous character
76     enumerator.next.should == '€' # advance
77     enumerator.last.should == 'h'
78     enumerator.next.should == 'l' # advance
79     enumerator.last.should == '€'
80     enumerator.next.should == 'l' # advance
81     enumerator.last.should == 'l'
82     enumerator.next.should == 'o' # advance
83     enumerator.last.should == 'l'
84     enumerator.next.should == nil # nothing left to scan
85     enumerator.last.should == 'o'
86     enumerator.last.should == 'o' # didn't advance, so should return the same
87   end
88 end