]> git.wincent.com - walrat.git/blob - spec/string_enumerator_spec.rb
Put license boilerplate on a diet
[walrat.git] / spec / string_enumerator_spec.rb
1 # encoding: utf-8
2 # Copyright 2007-2014 Greg Hurrell. All rights reserved.
3 # Licensed under the terms of the BSD 2-clause license.
4
5 require File.expand_path('spec_helper', File.dirname(__FILE__))
6
7 describe Walrat::StringEnumerator do
8   it 'raises an ArgumentError if initialized with nil' do
9     expect do
10       Walrat::StringEnumerator.new nil
11     end.to raise_error(ArgumentError, /nil string/)
12   end
13
14   it 'returns characters one by one until end of string, then return nil' do
15     enumerator = Walrat::StringEnumerator.new('hello')
16     enumerator.next.should == 'h'
17     enumerator.next.should == 'e'
18     enumerator.next.should == 'l'
19     enumerator.next.should == 'l'
20     enumerator.next.should == 'o'
21     enumerator.next.should be_nil
22   end
23
24   it 'is Unicode-aware (UTF-8)' do
25     enumerator = Walrat::StringEnumerator.new('€ cañon')
26     enumerator.next.should == '€'
27     enumerator.next.should == ' '
28     enumerator.next.should == 'c'
29     enumerator.next.should == 'a'
30     enumerator.next.should == 'ñ'
31     enumerator.next.should == 'o'
32     enumerator.next.should == 'n'
33     enumerator.next.should be_nil
34   end
35
36   # this was a bug
37   it 'continues past newlines' do
38     enumerator = Walrat::StringEnumerator.new("hello\nworld")
39     enumerator.next.should == 'h'
40     enumerator.next.should == 'e'
41     enumerator.next.should == 'l'
42     enumerator.next.should == 'l'
43     enumerator.next.should == 'o'
44     enumerator.next.should == "\n" # was returning nil here
45     enumerator.next.should == 'w'
46     enumerator.next.should == 'o'
47     enumerator.next.should == 'r'
48     enumerator.next.should == 'l'
49     enumerator.next.should == 'd'
50   end
51
52   it 'can recall the last character using the "last" method' do
53     enumerator = Walrat::StringEnumerator.new('h€llo')
54     enumerator.last.should == nil # nothing scanned yet
55     enumerator.next.should == 'h' # advance
56     enumerator.last.should == nil # still no previous character
57     enumerator.next.should == '€' # advance
58     enumerator.last.should == 'h'
59     enumerator.next.should == 'l' # advance
60     enumerator.last.should == '€'
61     enumerator.next.should == 'l' # advance
62     enumerator.last.should == 'l'
63     enumerator.next.should == 'o' # advance
64     enumerator.last.should == 'l'
65     enumerator.next.should == nil # nothing left to scan
66     enumerator.last.should == 'o'
67     enumerator.last.should == 'o' # didn't advance, so should return the same
68   end
69 end