[ruby/rexml] Message less confusing error to human (#16)

* Message less confusing error to human

* Problem: Following error message is not helpful, because you have to reason
  that '' actually means it's in the top-level, and the 'div' (not '</div>') is
  an end tag

        require "rexml/parsers/lightparser"
        REXML::Parsers::LightParser.new('</div>').parse
        #=> Missing end tag for '' (got 'div')

* Solution: add a special case in error handling just to change the error message

        require "rexml/parsers/lightparser"
        REXML::Parsers::LightParser.new('</div>').parse
        #=> Unexpected top-level end tag (got 'div')

* Refactor by removing unnecessary `md` check

* Thanks @a_matsuda to review this at asakusa.rb!

https://github.com/ruby/rexml/commit/f6528d4477
This commit is contained in:
ujihisa 2019-02-21 17:42:08 +09:00 коммит произвёл Hiroshi SHIBATA
Родитель 33e4a59b4a
Коммит f85caf40a6
2 изменённых файлов: 17 добавлений и 0 удалений

Просмотреть файл

@ -335,6 +335,10 @@ module REXML
@nsstack.shift
last_tag = @tags.pop
md = @source.match( CLOSE_MATCH, true )
if md and !last_tag
message = "Unexpected top-level end tag (got '#{md[1]}')"
raise REXML::ParseException.new(message, @source)
end
if md.nil? or last_tag != md[1]
message = "Missing end tag for '#{last_tag}'"
message << " (got '#{md[1]}')" if md

Просмотреть файл

@ -8,6 +8,19 @@ module REXMLTests
end
class TestInvalid < self
def test_top_level_end_tag
exception = assert_raise(REXML::ParseException) do
parse("</a>")
end
assert_equal(<<-DETAIL.chomp, exception.to_s)
Unexpected top-level end tag (got 'a')
Line: 1
Position: 4
Last 80 unconsumed characters:
DETAIL
end
def test_no_end_tag
exception = assert_raise(REXML::ParseException) do
parse("<a></")