Add real tests.
This commit is contained in:
parent
96dfad0178
commit
3aa2ac2634
5 changed files with 95 additions and 70 deletions
|
|
@ -3,5 +3,5 @@ source 'https://rubygems.org'
|
|||
gemspec
|
||||
|
||||
group :test do
|
||||
# ...
|
||||
gem 'minitest', '~> 5.2'
|
||||
end
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
4. To run tests, just run `rake`.
|
||||
|
||||
|
||||
## Installation
|
||||
|
||||
|
|
|
|||
7
src/bindings/ruby/Rakefile
Normal file
7
src/bindings/ruby/Rakefile
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
require 'rake/testtask'
|
||||
|
||||
Rake::TestTask.new do |t|
|
||||
t.pattern = "test/*_test.rb"
|
||||
end
|
||||
|
||||
task :default => [:test]
|
||||
|
|
@ -7,79 +7,13 @@ require 'hammer/parser_builder'
|
|||
# people can use "require 'hammer-parser'" in their code.
|
||||
|
||||
|
||||
|
||||
# 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
|
||||
|
||||
|
||||
# Leave this in for now to be able to play around with HParseResult in irb.
|
||||
x = nil
|
||||
parser = Hammer::Parser.build {
|
||||
token 'abc'
|
||||
x = indirect
|
||||
end_p
|
||||
}
|
||||
x.bind(h.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
|
||||
x.bind(Hammer::Parser.token('abd'))
|
||||
|
||||
$r = parser.parse 'abcabd'
|
||||
|
|
|
|||
82
src/bindings/ruby/test/parser_test.rb
Normal file
82
src/bindings/ruby/test/parser_test.rb
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue