Add real tests.

This commit is contained in:
Jakob Rath 2013-12-16 17:56:49 +01:00 committed by Dan Hirsch
parent 96dfad0178
commit 3aa2ac2634
5 changed files with 95 additions and 70 deletions

View file

@ -3,5 +3,5 @@ source 'https://rubygems.org'
gemspec gemspec
group :test do group :test do
# ... gem 'minitest', '~> 5.2'
end end

View file

@ -16,6 +16,8 @@ Ruby bindings for [hammer](https://github.com/UpstandingHackers/hammer), a parsi
3. Run `irb -I ./lib -r hammer` to open `irb` with hammer loaded. 3. Run `irb -I ./lib -r hammer` to open `irb` with hammer loaded.
4. To run tests, just run `rake`.
## Installation ## Installation

View file

@ -0,0 +1,7 @@
require 'rake/testtask'
Rake::TestTask.new do |t|
t.pattern = "test/*_test.rb"
end
task :default => [:test]

View file

@ -7,79 +7,13 @@ require 'hammer/parser_builder'
# people can use "require 'hammer-parser'" in their code. # people can use "require 'hammer-parser'" in their code.
# Leave this in for now to be able to play around with HParseResult in irb.
# TODO: Put tests in test/ directory.
parser = Hammer::Parser.build do
token 'blah'
ch 'a'.ord
choice {
sequence {
token 'abc'
}
token 'def'
}
end
p parser
if parser
p parser.parse 'blahaabcd'
p parser.parse 'blahadefd'
p parser.parse 'blahablad'
p parser.parse 'blaha'
p parser.parse 'blah'
end
parser = Hammer::Parser.build {
token 'Hello '
choice {
token 'Mom'
token 'Dad'
}
token '!'
}
p parser.parse 'Hello Mom!'
parser = Hammer::ParserBuilder.new
.token('Hello ')
.choice(Hammer::Parser.token('Mom'), Hammer::Parser.token('Dad'))
.token('!')
.build
p parser.parse 'Hello Mom!'
h = Hammer::Parser
parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
p parser.parse 'Hello Mom!'
s = 'blah'
parser = h.token(s)
p parser.parse 'BLAH' # => false
s.upcase!
p parser.parse 'BLAH' # => false
x = nil x = nil
parser = Hammer::Parser.build { parser = Hammer::Parser.build {
token 'abc' token 'abc'
x = indirect x = indirect
end_p end_p
} }
x.bind(h.token('abd')) x.bind(Hammer::Parser.token('abd'))
p parser.parse 'abcabdabd'
p parser.parse 'abcabd'
p parser.parse 'abdabd'
p parser.parse 'abd'
#$r = parser.parse 'abcabd'
# Test multibyte characters
parser = Hammer::Parser.build {
token '今日'
end_p
}
p ($r = parser.parse('今日')) # should succeed
$r = parser.parse 'abcabd'

View file

@ -0,0 +1,82 @@
require 'bundler/setup'
require 'hammer'
require 'minitest/autorun'
class ParserTest < Minitest::Test
def test_builder_1
parser = Hammer::Parser.build {
token 'blah'
ch 'a'.ord
choice {
sequence {
token 'abc'
}
token 'def'
}
}
refute_nil parser
refute_nil parser.parse('blahaabcd')
refute_nil parser.parse('blahadefd')
assert_nil parser.parse('blahablad')
assert_nil parser.parse('blaha')
assert_nil parser.parse('blah')
end
def test_builder_2
parser = Hammer::ParserBuilder.new
.token('Hello ')
.choice(Hammer::Parser.token('Mom'), Hammer::Parser.token('Dad'))
.token('!')
.build
refute_nil parser
refute_nil parser.parse('Hello Mom!')
end
def test_builder_3
h = Hammer::Parser
parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
refute_nil parser
refute_nil parser.parse('Hello Mom!')
end
def test_string_copied
s = 'blah'
parser = Hammer::Parser.token(s)
refute_equal s, 'BLAH'
assert_nil parser.parse('BLAH')
# parser still shouldn't match, even if we modify the string in-place
s.upcase!
assert_equal s, 'BLAH'
assert_nil parser.parse('BLAH')
end
def test_indirect
x = nil
parser = Hammer::Parser.build {
token 'abc'
x = indirect
end_p
}
x.bind(Hammer::Parser.token('abd'))
assert_nil parser.parse('abcabdabd')
refute_nil parser.parse('abcabd')
assert_nil parser.parse('abdabd')
assert_nil parser.parse('abc')
end
def test_multibyte_token
parser = Hammer::Parser.build {
token '今日'
end_p
}
refute_nil parser.parse('今日')
end
end