]> git.wincent.com - wikitext.git/blob - spec/link_encoding_spec.rb
New link encoding specs
[wikitext.git] / spec / link_encoding_spec.rb
1 #!/usr/bin/env ruby
2 # Copyright 2007-2008 Wincent Colaiuta
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation, either version 3 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 require File.join(File.dirname(__FILE__), 'spec_helper.rb')
17 require 'wikitext'
18 require 'uri'
19
20 describe Wikitext, 'encoding a link target' do
21   it 'should complain if passed nil' do
22     lambda { Wikitext::Parser.encode_link_target(nil) }.should raise_error
23   end
24
25   it 'should do nothing on zero-length input' do
26     Wikitext::Parser.encode_link_target('').should == ''
27   end
28
29   it 'should convert embedded spaces into "%20"' do
30     Wikitext::Parser.encode_link_target('hello world').should == 'hello%20world'
31   end
32
33   it 'should eat leading spaces' do
34     Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
35     Wikitext::Parser.encode_link_target('  hello world').should == 'hello%20world'
36     Wikitext::Parser.encode_link_target('   hello world').should == 'hello%20world'
37     Wikitext::Parser.encode_link_target('    hello world').should == 'hello%20world'
38     Wikitext::Parser.encode_link_target('     hello world').should == 'hello%20world'
39     Wikitext::Parser.encode_link_target('      hello world').should == 'hello%20world'
40   end
41
42   it 'should eat trailing spaces' do
43     Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
44     Wikitext::Parser.encode_link_target('hello world  ').should == 'hello%20world'
45     Wikitext::Parser.encode_link_target('hello world   ').should == 'hello%20world'
46     Wikitext::Parser.encode_link_target('hello world    ').should == 'hello%20world'
47     Wikitext::Parser.encode_link_target('hello world     ').should == 'hello%20world'
48     Wikitext::Parser.encode_link_target('hello world      ').should == 'hello%20world'
49   end
50
51   it 'should eat leading and trailing spaces combined' do
52     Wikitext::Parser.encode_link_target('     hello world ').should == 'hello%20world'
53     Wikitext::Parser.encode_link_target('     hello world ').should == 'hello%20world'
54     Wikitext::Parser.encode_link_target('    hello world  ').should == 'hello%20world'
55     Wikitext::Parser.encode_link_target('   hello world   ').should == 'hello%20world'
56     Wikitext::Parser.encode_link_target('  hello world    ').should == 'hello%20world'
57     Wikitext::Parser.encode_link_target(' hello world     ').should == 'hello%20world'
58   end
59
60   it 'should return nothing for input consisting entirely of spaces' do
61     Wikitext::Parser.encode_link_target(' ').should == ''
62     Wikitext::Parser.encode_link_target('  ').should == ''
63     Wikitext::Parser.encode_link_target('   ').should == ''
64     Wikitext::Parser.encode_link_target('    ').should == ''
65     Wikitext::Parser.encode_link_target('     ').should == ''
66     Wikitext::Parser.encode_link_target('      ').should == ''
67   end
68
69   it 'should convert reserved symbols into percent escapes' do
70     Wikitext::Parser.encode_link_target('http://www.apple.com/q?foo').should == 'http%3a%2f%2fwww.apple.com%2fq%3ffoo'
71   end
72
73   it 'should convert non-ASCII into UTF-8 and then apply percent escapes' do
74     Wikitext::Parser.encode_link_target('cañon').should == 'ca%c3%b1on'
75   end
76
77   it 'should handle mixed scenarios (commas, double-quotes and UTF-8)' do
78     Wikitext::Parser.encode_link_target('foo, "bar" & baz €').should == 'foo%2c%20%22bar%22%20%26%20baz%20%e2%82%ac'
79   end
80
81   it 'should get the same answer as URI.escape' do
82     reserved = Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
83     ['foo bar', 'http://www.google.com/search?q=hello&foo=bar', '€'].each do |string|
84       Wikitext::Parser.encode_link_target(string).should == URI.escape(string, reserved).downcase
85     end
86   end
87
88   # "special" links don't get transformed in any way
89   describe 'special links' do
90     it 'should recognize links which match /\A[a-z]+\/\d+\z/ as being special' do
91       string = 'foo/10'
92       Wikitext::Parser.encode_special_link_target(string).should == string
93       Wikitext::Parser.encode_link_target(string).should_not == string
94     end
95
96     it "should not recognize links which don't match at /\A/ as being special" do
97       string = '  foo/10'
98       Wikitext::Parser.encode_special_link_target(string).should_not == string
99       string = '..foo/10'
100       Wikitext::Parser.encode_special_link_target(string).should_not == string
101       string = '12foo/10'
102       Wikitext::Parser.encode_special_link_target(string).should_not == string
103     end
104
105     it "should not recognize links which don't match at /\z/ as being special" do
106       string = 'foo/10  '
107       Wikitext::Parser.encode_special_link_target(string).should_not == string
108       string = 'foo/10__'
109       Wikitext::Parser.encode_special_link_target(string).should_not == string
110       string = 'foo/10##'
111       Wikitext::Parser.encode_special_link_target(string).should_not == string
112       string = 'foo/10ab'
113       Wikitext::Parser.encode_special_link_target(string).should_not == string
114     end
115
116     it "should not recognize links which don't match at /[a-z]/ (case differences) as being special" do
117       string = 'FOO/10'
118       Wikitext::Parser.encode_special_link_target(string).should_not == string
119     end
120
121     it "should not recognize links which don't match at /[0-9]/ (case differences) as being special" do
122       string = 'foo/xx'
123       Wikitext::Parser.encode_special_link_target(string).should_not == string
124     end
125
126     it "should not recognize links which don't match at /\// as being special" do
127       string = 'foo 10'
128       Wikitext::Parser.encode_special_link_target(string).should_not == string
129     end
130   end
131 end
132