You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
8.0 KiB
318 lines
8.0 KiB
#!/usr/bin/ruby
|
|
# encoding: utf-8
|
|
|
|
require 'antlr3/test/functional'
|
|
|
|
class TestRewritingLexerOutputDirectly < ANTLR3::Test::Functional
|
|
inline_grammar( <<-'END' )
|
|
lexer grammar SimpleRewriting;
|
|
options {
|
|
language = Ruby;
|
|
}
|
|
|
|
A: 'a';
|
|
B: 'b';
|
|
C: 'c';
|
|
END
|
|
|
|
def rewrite( input, expected )
|
|
lexer = SimpleRewriting::Lexer.new( input )
|
|
tokens = ANTLR3::TokenRewriteStream.new( lexer )
|
|
yield( tokens )
|
|
tokens.render.should == expected
|
|
return( tokens )
|
|
end
|
|
|
|
example 'insert before' do
|
|
rewrite( 'abc', '0abc' ) do |stream|
|
|
stream.insert_before( 0, '0' )
|
|
end
|
|
end
|
|
|
|
example 'insert after last index' do
|
|
rewrite( 'abc', 'abcx' ) do |stream|
|
|
stream.insert_after( 2, 'x' )
|
|
end
|
|
end
|
|
|
|
example 'insert before after middle index' do
|
|
rewrite( 'abc', 'axbxc' ) do |stream|
|
|
stream.insert_before 1, 'x'
|
|
stream.insert_after 1, 'x'
|
|
end
|
|
end
|
|
|
|
example 'replace index 0' do
|
|
rewrite( 'abc', 'xbc' ) do |stream|
|
|
stream.replace( 0, 'x' )
|
|
end
|
|
end
|
|
|
|
example 'replace last index' do
|
|
rewrite( 'abc', 'abx' ) do |stream|
|
|
stream.replace 2, 'x'
|
|
end
|
|
end
|
|
|
|
example 'replace last index' do
|
|
rewrite( 'abc', 'abx' ) do |stream|
|
|
stream.replace( 2, 'x' )
|
|
end
|
|
end
|
|
|
|
example 'replace middle index' do
|
|
rewrite( 'abc', 'axc' ) do |stream|
|
|
stream.replace 1, 'x'
|
|
end
|
|
end
|
|
|
|
example 'replace middle index' do
|
|
rewrite( 'abc', 'ayc' ) do |stream|
|
|
stream.replace 1, 'x'
|
|
stream.replace 1, 'y'
|
|
end
|
|
end
|
|
|
|
example 'replace middle index 1 insert before' do
|
|
rewrite( 'abc', '_ayc' ) do |stream|
|
|
stream.insert_before 0, '_'
|
|
stream.replace 1, 'x'
|
|
stream.replace 1, 'y'
|
|
end
|
|
end
|
|
|
|
example 'replace then delete middle index' do
|
|
rewrite( 'abc', 'ac' ) do |stream|
|
|
stream.replace 1, 'x'
|
|
stream.delete 1
|
|
end
|
|
end
|
|
|
|
example 'insert then replace same index' do
|
|
rewrite 'abc', 'xbc' do |stream|
|
|
stream.insert_before 0, '0'
|
|
stream.replace 0, 'x'
|
|
end
|
|
end
|
|
|
|
example 'insert middle index' do
|
|
rewrite( "abc", "ayxbc" ) do |stream|
|
|
stream.insert_before( 1, "x" )
|
|
stream.insert_before( 1, "y" )
|
|
end
|
|
end
|
|
|
|
example 'insert then replace index0' do
|
|
rewrite( "abc", "zbc" ) do |stream|
|
|
stream.insert_before( 0, "x" )
|
|
stream.insert_before( 0, "y" )
|
|
stream.replace( 0, "z" )
|
|
end
|
|
end
|
|
|
|
example 'replace then insert before last index' do
|
|
rewrite( "abc", "abyx" ) do |stream|
|
|
stream.replace( 2, "x" )
|
|
stream.insert_before( 2, "y" )
|
|
end
|
|
end
|
|
|
|
example 'insert then replace last index' do
|
|
rewrite( "abc", "abx" ) do |stream|
|
|
stream.insert_before( 2, "y" )
|
|
stream.replace( 2, "x" )
|
|
end
|
|
end
|
|
|
|
example 'replace then insert after last index' do
|
|
rewrite( "abc", "abxy" ) do |stream|
|
|
stream.replace( 2, "x" )
|
|
stream.insert_after( 2, "y" )
|
|
end
|
|
end
|
|
|
|
example 'replace range then insert at left edge' do
|
|
rewrite( "abcccba", "abyxba" ) do |stream|
|
|
stream.replace( 2, 4, "x" )
|
|
stream.insert_before( 2, "y" )
|
|
end
|
|
end
|
|
|
|
example 'replace range then insert after right edge' do
|
|
rewrite( "abcccba", "abxyba" ) do |stream|
|
|
stream.replace( 2, 4, "x" )
|
|
stream.insert_after( 4, "y" )
|
|
end
|
|
end
|
|
|
|
example 'replace all' do
|
|
rewrite( "abcccba", "x" ) do |stream|
|
|
stream.replace( 0, 6, "x" )
|
|
end
|
|
end
|
|
|
|
example 'replace single middle then overlapping superset' do
|
|
rewrite( "abcba", "fooa" ) do |stream|
|
|
stream.replace( 2, 2, "xyz" )
|
|
stream.replace( 0, 3, "foo" )
|
|
end
|
|
end
|
|
|
|
example 'combine inserts' do
|
|
rewrite( "abc", "yxabc" ) do |stream|
|
|
stream.insert_before( 0, "x" )
|
|
stream.insert_before( 0, "y" )
|
|
end
|
|
end
|
|
|
|
example 'combine3 inserts' do
|
|
rewrite( "abc", "yazxbc" ) do |stream|
|
|
stream.insert_before( 1, "x" )
|
|
stream.insert_before( 0, "y" )
|
|
stream.insert_before( 1, "z" )
|
|
end
|
|
end
|
|
|
|
example 'disjoint inserts' do
|
|
rewrite( "abc", "zaxbyc" ) do |stream|
|
|
stream.insert_before( 1, "x" )
|
|
stream.insert_before( 2, "y" )
|
|
stream.insert_before( 0, "z" )
|
|
end
|
|
end
|
|
|
|
example 'leave alone disjoint insert' do
|
|
rewrite( "abcc", "axbfoo" ) do |stream|
|
|
stream.insert_before( 1, "x" )
|
|
stream.replace( 2, 3, "foo" )
|
|
end
|
|
end
|
|
|
|
example 'leave alone disjoint insert2' do
|
|
rewrite( "abcc", "axbfoo" ) do |stream|
|
|
stream.replace( 2, 3, "foo" )
|
|
stream.insert_before( 1, "x" )
|
|
end
|
|
end
|
|
|
|
example 'combine insert on left with delete' do
|
|
rewrite( "abc", "z" ) do |stream|
|
|
stream.delete( 0, 2 )
|
|
stream.insert_before( 0, "z" )
|
|
end
|
|
end
|
|
|
|
example 'overlapping replace' do
|
|
rewrite( "abcc", "bar" ) do |stream|
|
|
stream.replace( 1, 2, "foo" )
|
|
stream.replace( 0, 3, "bar" )
|
|
end
|
|
end
|
|
|
|
example 'overlapping replace3' do
|
|
rewrite( "abcc", "barc" ) do |stream|
|
|
stream.replace( 1, 2, "foo" )
|
|
stream.replace( 0, 2, "bar" )
|
|
end
|
|
end
|
|
|
|
example 'overlapping replace 4' do
|
|
rewrite( "abcc", "abar" ) do |stream|
|
|
stream.replace( 1, 2, "foo" )
|
|
stream.replace( 1, 3, "bar" )
|
|
end
|
|
end
|
|
|
|
example 'overlapping replace 2' do
|
|
lexer = SimpleRewriting::Lexer.new( 'abcc' )
|
|
stream = ANTLR3::TokenRewriteStream.new( lexer )
|
|
stream.replace 0, 3, 'bar'
|
|
stream.replace 1, 2, 'foo'
|
|
|
|
lambda { stream.render }.
|
|
should raise_error { |error|
|
|
error.to_s.should == %q<operation (replace @ 1..2 : "foo") overlaps with previous operation (replace @ 0..3 : "bar")>
|
|
}
|
|
end
|
|
|
|
example 'replace range then insert at right edge' do
|
|
lexer = SimpleRewriting::Lexer.new( 'abcccba' )
|
|
stream = ANTLR3::TokenRewriteStream.new( lexer )
|
|
stream.replace 2, 4, 'x'
|
|
stream.insert_before 4, 'y'
|
|
lambda { stream.render }.
|
|
should raise_error { |error|
|
|
error.to_s.should == %q<operation (insert-before @ 4 : "y") overlaps with previous operation (replace @ 2..4 : "x")>
|
|
}
|
|
end
|
|
|
|
example 'replace then replace superset' do
|
|
lexer = SimpleRewriting::Lexer.new( 'abcccba' )
|
|
stream = ANTLR3::TokenRewriteStream.new( lexer )
|
|
stream.replace 2, 4, 'xyz'
|
|
stream.replace 3, 5, 'foo'
|
|
lambda { stream.render }.
|
|
should raise_error { |error|
|
|
error.to_s.should == %q<operation (replace @ 3..5 : "foo") overlaps with previous operation (replace @ 2..4 : "xyz")>
|
|
}
|
|
end
|
|
|
|
example 'replace then replace lower indexed superset' do
|
|
lexer = SimpleRewriting::Lexer.new( 'abcccba' )
|
|
stream = ANTLR3::TokenRewriteStream.new( lexer )
|
|
stream.replace 2, 4, 'xyz'
|
|
stream.replace 1, 3, 'foo'
|
|
lambda { stream.render }.
|
|
should raise_error { |error|
|
|
error.to_s.should == %q<operation (replace @ 1..3 : "foo") overlaps with previous operation (replace @ 2..4 : "xyz")>
|
|
}
|
|
end
|
|
|
|
end
|
|
|
|
class TestRewritingWithTokenStream2 < ANTLR3::Test::Functional
|
|
inline_grammar( <<-END )
|
|
lexer grammar SimpleRewriting2;
|
|
options {
|
|
language = Ruby;
|
|
}
|
|
|
|
ID : 'a'..'z'+;
|
|
INT : '0'..'9'+;
|
|
SEMI : ';';
|
|
PLUS : '+';
|
|
MUL : '*';
|
|
ASSIGN : '=';
|
|
WS : ' '+;
|
|
END
|
|
|
|
def rewrite( input )
|
|
lexer = SimpleRewriting2::Lexer.new( input )
|
|
ANTLR3::TokenRewriteStream.new( lexer )
|
|
end
|
|
|
|
example 'rendering over a range' do
|
|
stream = rewrite 'x = 3 * 0;'
|
|
stream.replace 4, 8, '0'
|
|
stream.original_string.should == 'x = 3 * 0;'
|
|
stream.render.should == 'x = 0;'
|
|
stream.render( 0, 9 ).should == 'x = 0;'
|
|
stream.render( 4, 8 ).should == '0'
|
|
end
|
|
|
|
example 'more rendering over a range' do
|
|
stream = rewrite 'x = 3 * 0 + 2 * 0;'
|
|
stream.original_string.should == 'x = 3 * 0 + 2 * 0;'
|
|
stream.replace 4, 8, '0'
|
|
stream.render.should == 'x = 0 + 2 * 0;'
|
|
stream.render( 0, 17 ).should == 'x = 0 + 2 * 0;'
|
|
stream.render( 4, 8 ).should == '0'
|
|
stream.render( 0, 8 ).should == 'x = 0'
|
|
stream.render( 12, 16 ).should == '2 * 0'
|
|
stream.insert_after( 17, '// comment' )
|
|
stream.render( 12, 17 ).should == '2 * 0;// comment'
|
|
stream.render( 0, 8 ).should == 'x = 0'
|
|
end
|
|
|
|
end
|