1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
RSpec::Matchers.define(:parse) do |input, opts|
as = block = nil
result = trace = nil
match do |parser|
begin
result = parser.parse(input)
block ?
block.call(result) :
(as == result || as.nil?)
rescue Parslet::ParseFailed => ex
trace = ex.parse_failure_cause.ascii_tree if opts && opts[:trace]
false
end
end
public_send(respond_to?(:failure_message) ? :failure_message : :failure_message_for_should) do |is|
if block
"expected output of parsing #{input.inspect}" <<
" with #{is.inspect} to meet block conditions, but it didn't"
else
"expected " <<
(as ?
"output of parsing #{input.inspect}"<<
" with #{is.inspect} to equal #{as.inspect}, but was #{result.inspect}" :
"#{is.inspect} to be able to parse #{input.inspect}") <<
(trace ?
"\n"+trace :
'')
end
end
public_send(respond_to?(:failure_message_when_negated) ? :failure_message_when_negated : :failure_message_for_should_not) do |is|
if block
"expected output of parsing #{input.inspect} with #{is.inspect} not to meet block conditions, but it did"
else
"expected " <<
(as ?
"output of parsing #{input.inspect}"<<
" with #{is.inspect} not to equal #{as.inspect}" :
"#{is.inspect} to not parse #{input.inspect}, but it did")
end
end
# NOTE: This has a nodoc tag since the rdoc parser puts this into
# Object, a thing I would never allow.
chain :as do |expected_output=nil, &my_block|
as = expected_output
block = my_block
end
end
|