]> git.wincent.com - walrat.git/blob - spec/additions/string_spec.rb
Update to RSpec 3.1.0
[walrat.git] / spec / additions / string_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 'spec_helper'
6
7 describe String do
8   describe '#to_class_name' do
9     it 'works with require names' do
10       'foo_bar'.to_class_name.should == 'FooBar'
11     end
12
13     it 'works with a single-letter' do
14       'f'.to_class_name.should == 'F'
15     end
16
17     it 'works with double-underscores' do
18       'foo__bar'.to_class_name.should == 'FooBar'
19     end
20
21     it 'works with terminating double-underscores' do
22       'foo__'.to_class_name.should == 'Foo'
23     end
24   end
25 end
26
27 describe 'iterating over a string' do
28   # formerly a bug: the StringScanner used under the covers was returning nil
29   # (stopping) on hitting a newline
30   it 'should be able to iterate over strings containing newlines' do
31     chars = []
32     "hello\nworld".each_char { |c| chars << c }
33     chars.should == ['h', 'e', 'l', 'l', 'o', "\n",
34       'w', 'o', 'r', 'l', 'd']
35   end
36 end
37
38 describe 'working with Unicode strings' do
39   before do
40     # € (Euro) is a three-byte UTF-8 glyph: "\342\202\254"
41     @string = 'Unicode €!'
42   end
43
44   it 'the "each_char" method should work with multibyte characters' do
45     chars = []
46     @string.each_char { |c| chars << c }
47     chars.should == ['U', 'n', 'i', 'c', 'o', 'd', 'e', ' ', '€', '!']
48   end
49
50   it 'the "chars" method should work with multibyte characters' do
51     @string.chars.to_a.should == ['U', 'n', 'i', 'c', 'o', 'd', 'e', ' ', '€', '!']
52   end
53
54   it 'should be able to use "enumerator" convenience method to get a string enumerator' do
55     enumerator = 'hello€'.enumerator
56     enumerator.next.should == 'h'
57     enumerator.next.should == 'e'
58     enumerator.next.should == 'l'
59     enumerator.next.should == 'l'
60     enumerator.next.should == 'o'
61     enumerator.next.should == '€'
62     enumerator.next.should be_nil
63   end
64
65   it 'the "jlength" method should correctly report the number of characters in a string' do
66     @string.jlength.should  == 10
67     "€".jlength.should      == 1  # three bytes long, but one character
68   end
69 end
70
71 # For more detailed specification of the StringParslet behaviour see
72 # string_parslet_spec.rb.
73 describe 'using shorthand to get StringParslets from String instances' do
74   it 'chaining two Strings with the "&" operator should yield a two-element sequence' do
75     sequence = 'foo' & 'bar'
76     sequence.parse('foobar').should == ['foo', 'bar']
77     lambda { sequence.parse('no match') }.should raise_error(Walrat::ParseError)
78   end
79
80   it 'chaining three Strings with the "&" operator should yield a three-element sequence' do
81     sequence = 'foo' & 'bar' & '...'
82     sequence.parse('foobar...').should == ['foo', 'bar', '...']
83     lambda { sequence.parse('no match') }.should raise_error(Walrat::ParseError)
84   end
85
86   it 'alternating two Strings with the "|" operator should yield a single string' do
87     sequence = 'foo' | 'bar'
88     sequence.parse('foo').should == 'foo'
89     sequence.parse('foobar').should == 'foo'
90     sequence.parse('bar').should == 'bar'
91     lambda { sequence.parse('no match') }.should raise_error(Walrat::ParseError)
92   end
93 end