test_linkparse.rb
101 lines
| 2.7 KiB
| text/x-ruby
|
RubyLexer
|
r2376 | require 'test/unit' | ||
require 'testutil' | ||||
require 'openid/consumer/html_parse' | ||||
class LinkParseTestCase < Test::Unit::TestCase | ||||
include OpenID::TestDataMixin | ||||
def attr_cmp(expected, found) | ||||
e = expected.to_a.sort | ||||
f = found.to_a.sort | ||||
while (ep = e.shift) | ||||
ek, ev = ep | ||||
fk, fv = f.shift | ||||
ok = false | ||||
while ek[-1] == '*'[0] # optional entry detected | ||||
if fk == ek[0...-1] and fv==ev # optional entry found | ||||
ok = true | ||||
break | ||||
else # not found. okay, move on to next expected pair | ||||
ek, ev = e.shift | ||||
end | ||||
if ek.nil? | ||||
if fk == nil | ||||
ok = true | ||||
end | ||||
break | ||||
end | ||||
end | ||||
next if ok | ||||
next if fk == ek and fv == ev | ||||
return false | ||||
end | ||||
return f.empty? | ||||
end | ||||
def test_attrcmp | ||||
good = [ | ||||
[{'foo' => 'bar'},{'foo' => 'bar'}], | ||||
[{'foo*' => 'bar'},{'foo' => 'bar'}], | ||||
[{'foo' => 'bar', 'bam*' => 'baz'},{'foo' => 'bar'}], | ||||
[{'foo' => 'bar', 'bam*' => 'baz', 'tak' => 'tal'}, | ||||
{'foo' => 'bar', 'tak' => 'tal'}], | ||||
] | ||||
bad = [ | ||||
[{},{'foo' => 'bar'}], | ||||
[{'foo' => 'bar'}, {'bam' => 'baz'}], | ||||
[{'foo' => 'bar'}, {}], | ||||
[{'foo*' => 'bar'},{'foo*' => 'bar'}], | ||||
[{'foo' => 'bar', 'tak' => 'tal'}, {'foo' => 'bar'}] | ||||
] | ||||
good.each{|c|assert(attr_cmp(c[0],c[1]),c.inspect)} | ||||
bad.each{|c|assert(!attr_cmp(c[0],c[1]),c.inspect)} | ||||
end | ||||
def test_linkparse | ||||
cases = read_data_file('linkparse.txt', false).split("\n\n\n") | ||||
numtests = nil | ||||
testnum = 0 | ||||
cases.each {|c| | ||||
headers, html = c.split("\n\n",2) | ||||
expected_links = [] | ||||
name = "" | ||||
testnum += 1 | ||||
headers.split("\n").each{|h| | ||||
k,v = h.split(":",2) | ||||
v = '' if v.nil? | ||||
if k == "Num Tests" | ||||
assert(numtests.nil?, "datafile parsing error: there can be only one NumTests") | ||||
numtests = v.to_i | ||||
testnum = 0 | ||||
next | ||||
elsif k == "Name" | ||||
name = v.strip | ||||
elsif k == "Link" or k == "Link*" | ||||
attrs = {} | ||||
v.strip.split.each{|a| | ||||
kk,vv = a.split('=') | ||||
attrs[kk]=vv | ||||
} | ||||
expected_links << [k== "Link*", attrs] | ||||
else | ||||
assert(false, "datafile parsing error: bad header #{h}") | ||||
end | ||||
} | ||||
links = OpenID::parse_link_attrs(html) | ||||
found = links.dup | ||||
expected = expected_links.dup | ||||
while(fl = found.shift) | ||||
optional, el = expected.shift | ||||
while optional and !attr_cmp(el, fl) and not expected.empty? | ||||
optional, el = expected.shift | ||||
end | ||||
assert(attr_cmp(el,fl), "#{name}: #{fl.inspect} does not match #{el.inspect}") | ||||
end | ||||
} | ||||
assert_equal(numtests, testnum, "Number of tests") | ||||
end | ||||
end | ||||