/**
*
*/
package com.sap.furcas.parsergenerator.tcs.t2m.grammar;
import static com.sap.furcas.parsergenerator.testutils.RuleComparisonHelper.tokens;
import static org.junit.Assert.assertEquals;
import java.util.List;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.TCS.EndOfLineRule;
import com.sap.furcas.metamodel.FURCAS.TCS.Mapping;
import com.sap.furcas.metamodel.FURCAS.TCS.MultiLineRule;
import com.sap.furcas.metamodel.FURCAS.TCS.OrPattern;
import com.sap.furcas.metamodel.FURCAS.TCS.SimplePattern;
import com.sap.furcas.metamodel.FURCAS.TCS.StringPattern;
import com.sap.furcas.metamodel.FURCAS.TCS.TCSPackage;
import com.sap.furcas.metamodel.FURCAS.TCS.Word;
import com.sap.furcas.metamodel.FURCAS.TCS.WordRule;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.ClassPatternStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.LocatedElementStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.OrPatternStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.RulePatternStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.StringPatternStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.TokenStub;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.ANTLR3WriterStub;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.rules.AbstractAntlr3Rule;
/**
*
*/
public class TokenHandlerTest {
@Test
public void testAddElementClassAlpha() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
ClassPatternStub cps = new ClassPatternStub();
cps.name = "alpha";
patterns.add(cps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ((\'A\' .. \'Z\'| \'a\' .. \'z\')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementClassAlphaNum() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
ClassPatternStub cps = new ClassPatternStub();
cps.name = "alnum";
patterns.add(cps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ((\'A\' .. \'Z\'| \'a\' .. \'z\'| \'0\' .. \'9\')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementClassStringPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
StringPatternStub cps = new StringPatternStub();
cps.name = "someString";
patterns.add(cps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ('someString') ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementClassMultiStringPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
StringPatternStub cps = new StringPatternStub();
cps.name = "someString";
patterns.add(cps);
cps = new StringPatternStub();
cps.name = "someString2";
patterns.add(cps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ('someString' | 'someString2') ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementEOLRulePat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
EndOfLineRuleStub rulestub= new EndOfLineRuleStub();
rulestub.stringPat.name="//";
rps.rule = rulestub;
patterns.add(rps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (((\'//\' (~(\'\\r\'| \'\\n\'))*))) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementEOLRuleEscapedPat() throws Exception {
// hyphen needs to be escaped
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
EndOfLineRuleStub rulestub= new EndOfLineRuleStub();
rulestub.stringPat.name="'";
rps.rule = rulestub;
patterns.add(rps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (((\'\\'\' (~(\'\\r\'| \'\\n\'))*))) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementMultiLineRulePat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
MultiLineRuleStub rulestub= new MultiLineRuleStub();
rulestub.startPat.name="/*";
rulestub.endPat.name="*/";
rps.rule = rulestub;
patterns.add(rps);
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ((('/*' (options {greedy = false;} : ('\\n'| ~ '\\n'))* '*/'))) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementWordstartEndPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
patterns.add(rps);
EList<SimplePattern> startPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps1 = new StringPatternStub();
sps1.name = "startString";
startPatterns.add(sps1);
EList<SimplePattern> endPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps2 = new StringPatternStub();
sps2.name = "endString";
endPatterns.add(sps2);
WordRuleStub rulestub= new WordRuleStub();
rulestub.startPat = getOrPatternStub(startPatterns);
rulestub.endPat= getOrPatternStub(endPatterns);
rps.rule = rulestub;
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (('startString') ('endString')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementWordPartEndPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
patterns.add(rps);
EList<SimplePattern> partPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps1 = new StringPatternStub();
sps1.name = "partString";
partPatterns.add(sps1);
EList<SimplePattern> endPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps2 = new StringPatternStub();
sps2.name = "endString";
endPatterns.add(sps2);
WordRuleStub rulestub= new WordRuleStub();
rulestub.partPat = getOrPatternStub(partPatterns);
rulestub.endPat= getOrPatternStub(endPatterns);
rps.rule = rulestub;
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ((('partString'))* ('endString')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementWordStartPartEndPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
patterns.add(rps);
EList<SimplePattern> startPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps0 = new StringPatternStub();
sps0.name = "startString";
startPatterns.add(sps0);
EList<SimplePattern> partPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps1 = new StringPatternStub();
sps1.name = "partString";
partPatterns.add(sps1);
EList<SimplePattern> endPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps2 = new StringPatternStub();
sps2.name = "endString";
endPatterns.add(sps2);
WordRuleStub rulestub= new WordRuleStub();
rulestub.startPat = getOrPatternStub(startPatterns);
rulestub.partPat = getOrPatternStub(partPatterns);
rulestub.endPat= getOrPatternStub(endPatterns);
rps.rule = rulestub;
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (('startString') (('partString'))* ('endString')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementWordMultiStartPartEndPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
patterns.add(rps);
EList<SimplePattern> startPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps0 = new StringPatternStub();
sps0.name = "startString";
startPatterns.add(sps0);
sps0 = new StringPatternStub();
sps0.name = "startString2";
startPatterns.add(sps0);
EList<SimplePattern> partPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps1 = new StringPatternStub();
sps1.name = "partString";
partPatterns.add(sps1);
sps1 = new StringPatternStub();
sps1.name = "partString2";
partPatterns.add(sps1);
EList<SimplePattern> endPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps2 = new StringPatternStub();
sps2.name = "endString";
endPatterns.add(sps2);
sps2 = new StringPatternStub();
sps2.name = "endString2";
endPatterns.add(sps2);
WordRuleStub rulestub= new WordRuleStub();
rulestub.startPat = getOrPatternStub(startPatterns);
rulestub.partPat = getOrPatternStub(partPatterns);
rulestub.endPat= getOrPatternStub(endPatterns);
rps.rule = rulestub;
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (('startString' | 'startString2') (('partString' | 'partString2'))* ('endString' | 'endString2')) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementWordStartPartPat() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
RulePatternStub rps = new RulePatternStub();
rps.name = "someString";
patterns.add(rps);
EList<SimplePattern> startPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps0 = new StringPatternStub();
sps0.name = "startString";
startPatterns.add(sps0);
EList<SimplePattern> partPatterns = new BasicEList<SimplePattern>();
StringPatternStub sps1 = new StringPatternStub();
sps1.name = "partString";
partPatterns.add(sps1);
WordRuleStub rulestub= new WordRuleStub();
rulestub.startPat = getOrPatternStub(startPatterns);
rulestub.partPat = getOrPatternStub(partPatterns);
rps.rule = rulestub;
TokenStub token = createTokenDefinition("testToken", patterns);
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : (('startString') (('partString'))* ) ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
@Test
public void testAddElementOmittedToken() throws Exception {
ANTLR3WriterStub writerStub = new ANTLR3WriterStub();
// Class under test
TokenHandler althandler = new TokenHandler(writerStub, null);
EList<SimplePattern> patterns = new BasicEList<SimplePattern>();
ClassPatternStub cps = new ClassPatternStub();
cps.name = "alpha";
patterns.add(cps);
TokenStub token = createTokenDefinition("testToken", patterns);
token.isOmitted = true;
althandler.addToken(token);
assertEquals(1, writerStub.rules.size() );
AbstractAntlr3Rule result = writerStub.rules.get(0);
String expected = "testToken : ((\'A\' .. \'Z\'| \'a\' .. \'z\')){$channel=HIDDEN;} ;";
List tokens = tokens( expected);
List tokens2 = tokens( result.toString());
assertEquals(tokens, tokens2);
}
/**
* util method for getting a token stub
* @param string
* @param patterns
* @return
*/
private TokenStub createTokenDefinition(String name, EList<SimplePattern> patterns) {
TokenStub token = new TokenStub();
token.orPattern = getOrPatternStub(patterns) ;
token.name = name;
return token;
}
private OrPatternStub getOrPatternStub(EList<SimplePattern> patterns) {
OrPatternStub orPattern = new OrPatternStub();
orPattern.simplePatterns = patterns;
return orPattern;
}
class MultiLineRuleStub extends LocatedElementStub implements MultiLineRule {
public StringPatternStub startPat = new StringPatternStub();
public StringPatternStub endPat = new StringPatternStub();
/* (non-Javadoc)
* @see tcs.MultiLineRule#getEnd()
*/
@Override
public StringPattern getEnd() {
return endPat;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#getStart()
*/
@Override
public StringPattern getStart() {
return startPat;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#getEsc()
*/
@Override
public StringPattern getEsc() {
return null;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#getEscMappings()
*/
@Override
public EList<Mapping> getEscMappings() {
return null;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#isDropEnd()
*/
@Override
public boolean isDropEnd() {
return false;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#isDropStart()
*/
@Override
public boolean isDropStart() {
return false;
}
/* (non-Javadoc)
* @see tcs.MultiLineRule#setDropEnd(boolean)
*/
@Override
public void setDropEnd(boolean newValue) {}
/* (non-Javadoc)
* @see tcs.MultiLineRule#setDropStart(boolean)
*/
@Override
public void setDropStart(boolean newValue) { }
@Override
public void setEnd(StringPattern newValue) { }
@Override
public void setEsc(StringPattern newValue) { }
@Override
public void setStart(StringPattern newValue) { }
@Override
public EClass eClass() {
return TCSPackage.eINSTANCE.getMultiLineRule();
}
}
class WordRuleStub extends LocatedElementStub implements WordRule {
private OrPatternStub startPat = new OrPatternStub();
private OrPatternStub partPat = new OrPatternStub();
private OrPatternStub endPat = new OrPatternStub();
/* (non-Javadoc)
* @see tcs.WordRule#getEnd()
*/
@Override
public OrPattern getEnd() {
return endPat;
}
/* (non-Javadoc)
* @see tcs.WordRule#getPart()
*/
@Override
public OrPattern getPart() {
return partPat;
}
/* (non-Javadoc)
* @see tcs.WordRule#getStart()
*/
@Override
public OrPattern getStart() {
return startPat;
}
@Override
public void setEnd(OrPattern newValue) {}
@Override
public void setPart(OrPattern newValue) {}
@Override
public void setStart(OrPattern newValue) { }
@Override
public EList<Word> getWords() {
return null;
}
@Override
public EClass eClass() {
return TCSPackage.eINSTANCE.getWordRule();
}
}
class EndOfLineRuleStub extends LocatedElementStub implements EndOfLineRule {
public StringPatternStub stringPat = new StringPatternStub();
/* (non-Javadoc)
* @see tcs.EndOfLineRule#getStart()
*/
@Override
public StringPattern getStart() {
return stringPat;
}
/* (non-Javadoc)
* @see tcs.EndOfLineRule#isDropStart()
*/
@Override
public boolean isDropStart() {
return false;
}
/* (non-Javadoc)
* @see tcs.EndOfLineRule#setDropStart(boolean)
*/
@Override
public void setDropStart(boolean newValue) {
}
/* (non-Javadoc)
* @see tcs.EndOfLineRule#setStart(tcs.StringPattern)
*/
@Override
public void setStart(StringPattern newValue) { }
@Override
public EClass eClass() {
return TCSPackage.eINSTANCE.getEndOfLineRule();
}
}
}