test/input_test.rb in citrus-2.1.2 vs test/input_test.rb in citrus-2.2.0
- old
+ new
@@ -1,22 +1,192 @@
require File.expand_path('../helper', __FILE__)
class InputTest < Test::Unit::TestCase
+ def test_memoized?
+ input = Input.new('')
+ input.memoize!
+ assert(input.memoized?)
+ end
- def test_new_input
+ def test_offsets_new
input = Input.new("abc\ndef\nghi")
assert_equal(0, input.line_offset)
assert_equal(0, input.line_index)
assert_equal(1, input.line_number)
assert_equal("abc\n", input.line)
end
- def test_advanced_input
+ def test_offsets_advanced
input = Input.new("abc\ndef\nghi")
input.pos = 6
assert_equal(2, input.line_offset)
assert_equal(1, input.line_index)
assert_equal(2, input.line_number)
assert_equal("def\n", input.line)
end
+ def test_events
+ a = Rule.new('a')
+ b = Rule.new('b')
+ c = Rule.new('c')
+ s = Rule.new([ a, b, c ])
+ r = Repeat.new(s, 0, Infinity)
+
+ input = Input.new("abcabcabc")
+ events = input.exec(r)
+
+ expected_events = [
+ r.id,
+ s.id,
+ a.id, CLOSE, 1,
+ b.id, CLOSE, 1,
+ c.id, CLOSE, 1,
+ CLOSE, 3,
+ s.id,
+ a.id, CLOSE, 1,
+ b.id, CLOSE, 1,
+ c.id, CLOSE, 1,
+ CLOSE, 3,
+ s.id,
+ a.id, CLOSE, 1,
+ b.id, CLOSE, 1,
+ c.id, CLOSE, 1,
+ CLOSE, 3,
+ CLOSE, 9
+ ]
+
+ assert_equal(expected_events, events)
+ end
+
+ def test_events2
+ a = Rule.new('a')
+ b = Rule.new('b')
+ c = Choice.new([ a, b ])
+ r = Repeat.new(c, 0, Infinity)
+ s = Rule.new([ a, r ])
+
+ input = Input.new('abbababba')
+ events = input.exec(s)
+
+ expected_events = [
+ s.id,
+ a.id, CLOSE, 1,
+ r.id,
+ c.id,
+ b.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ b.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ a.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ b.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ a.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ b.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ b.id, CLOSE, 1,
+ CLOSE, 1,
+ c.id,
+ a.id, CLOSE, 1,
+ CLOSE, 1,
+ CLOSE, 8,
+ CLOSE, 9
+ ]
+
+ assert_equal(expected_events, events)
+ end
+
+ grammar :LetterA do
+ rule :top do
+ any(:three_as, :two_as, :one_a)
+ end
+
+ rule :three_as do
+ rep(:one_a, 3, 3)
+ end
+
+ rule :two_as do
+ rep(:one_a, 2, 2)
+ end
+
+ rule :one_a do
+ "a"
+ end
+ end
+
+ def test_cache_hits1
+ input = Input.new('a')
+ input.memoize!
+ input.exec(LetterA.rule(:top))
+ assert_equal(3, input.cache_hits)
+ end
+
+ def test_cache_hits2
+ input = Input.new('aa')
+ input.memoize!
+ input.exec(LetterA.rule(:top))
+ assert_equal(2, input.cache_hits)
+ end
+
+ def test_cache_hits3
+ input = Input.new('aaa')
+ input.memoize!
+ input.exec(LetterA.rule(:top))
+ assert_equal(0, input.cache_hits)
+ end
+
+ grammar :Addition do
+ rule :additive do
+ all(:number, :plus, label(any(:additive, :number), 'term')) {
+ number.value + term.value
+ }
+ end
+
+ rule :number do
+ all(/[0-9]+/, :space) {
+ strip.to_i
+ }
+ end
+
+ rule :plus do
+ all('+', :space)
+ end
+
+ rule :space do
+ /[ \t]*/
+ end
+ end
+
+ def test_match
+ match = Addition.parse('+', :root => :plus)
+ assert(match)
+ assert(match.matches)
+ assert_equal(2, match.matches.length)
+
+ match = Addition.parse('+ ', :root => :plus)
+ assert(match)
+ assert(match.matches)
+ assert_equal(2, match.matches.length)
+
+ match = Addition.parse('99', :root => :number)
+ assert(match)
+ assert(match.matches)
+ assert_equal(2, match.matches.length)
+
+ match = Addition.parse('99 ', :root => :number)
+ assert(match)
+ assert(match.matches)
+ assert_equal(2, match.matches.length)
+
+ match = Addition.parse('1+2')
+ assert(match)
+ assert(match.matches)
+ assert_equal(3, match.matches.length)
+ end
end