/**
*
*/
package com.sap.furcas.runtime.parser.impl;
import static junit.framework.Assert.assertEquals;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.RecognizerSharedState;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;
import org.junit.Test;
import com.sap.furcas.runtime.parser.ANTLR3LocationToken;
import com.sap.furcas.runtime.parser.IParsingObserver;
import com.sap.furcas.runtime.parser.antlr3.ANTLR3LocationTokenImpl;
/**
*
*/
public class TestObservableParser {
@Test
public void testNullObserverNoException() throws Exception {
TestableObservablePatchedParser parser = new TestableObservablePatchedParser(null, null);
parser._afterSeqEl();
parser._beforeSeqEl();
parser._enterAlt(1);
parser._exitAlt();
parser.onEnterTemplateRule(null);
parser.onErrorInTemplateRule(null);
parser.onExitTemplateRule();
parser.onRuleElementCreationCommited(null);
parser.onRuleElementResolvedOutOfContext(null, null, null, null);
}
/**
* test add and remove functionality of the DelegationParsingObserver helper class
*/
@Test
public void testDelegationParsingObserverAddRemove() {
MockObserver mock = new MockObserver();
DelegationParsingObserver delegationObserver = new DelegationParsingObserver();
assertEquals("", mock.result);
// not yet added mock observer
delegationObserver.notifyEnterSequenceElement();
assertEquals("", mock.result);
delegationObserver.addParsingObserver(mock);
// should fire
delegationObserver.notifyEnterSequenceElement();
assertEquals("3", mock.result);
delegationObserver.removeParsingObserver(mock);
// should not fire, result should not change
delegationObserver.notifyCommittedModelElementCreation(null);
assertEquals("3", mock.result);
}
/**
* a mere regression test
*
* @throws Exception
*/
@Test
public void testObserverOneEvent() throws Exception {
TestableObservablePatchedParser parser = new TestableObservablePatchedParser(null, null);
MockObserver mock = new MockObserver();
// test the (simple) DelegationParsingObserver class also
DelegationParsingObserver delegationObserver = new DelegationParsingObserver();
delegationObserver.addParsingObserver(mock);
parser.setObserver(delegationObserver);
parser._afterSeqEl();
assertEquals("7", mock.result);
parser._beforeSeqEl();
assertEquals("3", mock.result);
parser._enterAlt(1);
assertEquals("21", mock.result);
parser._enterAlt(0);
assertEquals("20", mock.result);
parser._exitAlt();
assertEquals("6", mock.result);
parser.onEnterTemplateRule("platform:/plugin/com.example/mapping/TCS.tcs#//@templates.1");
assertEquals("1platform:/plugin/com.example/mapping/TCS.tcs#//@templates.1", mock.result);
parser.onErrorInTemplateRule(new RecognitionException());
assertEquals("4null", mock.result);
parser.onExitTemplateRule();
assertEquals("5", mock.result);
parser.onRuleElementCreationCommited("test");
assertEquals("8test", mock.result);
parser.onRuleElementResolvedOutOfContext("test", "1234", new ANTLR3LocationTokenImpl(3, "hello"), null);
assertEquals("9test1234hello", mock.result);
}
/**
* @return
*/
private class MockObserver implements IParsingObserver {
public String result = "";
@Override
public void notifyEnterRule(String templateURI) {
result = 1 + templateURI;
}
@Override
public void notifyEnterSequenceAlternative(int choice) {
result = 2 + Integer.toString(choice);
}
@Override
public void notifyEnterSequenceElement() {
result = "3";
}
@Override
public void notifyEnterSequenceElement(String sequenceElementURI) {
result = "3";
}
@Override
public void notifyErrorInRule(RecognitionException re) {
result = 4 + re.getMessage();
}
@Override
public void notifyExitRule() {
result = "5";
}
@Override
public void notifyExitSequenceAlternative() {
result = "6";
}
@Override
public void notifyExitSequenceElement() {
result = "7";
}
@Override
public void notifyCommittedModelElementCreation(Object newModelElement) {
result = 8 + newModelElement.toString();
}
@Override
public void notifyModelElementResolvedOutOfContext(Object modelElement, Object contextModelElement,
Token referenceLocation, DelayedReference reference) {
result = 9 + modelElement.toString() + contextModelElement + referenceLocation.getText()
+ ((reference == null) ? "" : reference);
}
@Override
public void notifyTokenConsume(Token token) {
result = 10 + token.getText();
}
@Override
public void notifyTokenConsumeWithError(Token token) {
result = 11 + token.getText();
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyModelElementResolutionFailed()
*/
@Override
public void notifyCommitModelElementFailed() {
result = "12";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterSeparatorSequence()
*/
@Override
public void notifyEnterSeparatorSequence() {
result = "13";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitSeparatorSequence()
*/
@Override
public void notifyExitSeparatorSequence() {
result = "14";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterOperatoredBrackettedSequence()
*/
@Override
public void notifyEnterOperatoredBrackettedSequence() {
result = "15";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitOperatoredBrackettedSequence()
*/
@Override
public void notifyExitOperatoredBrackettedSequence() {
result = "16";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyEnterOperatorSequence(java.lang.String, int, boolean)
*/
@Override
public void notifyEnterOperatorSequence(String operator, int arity, boolean isUnaryPostfix) {
result = "17";
}
/*
* (non-Javadoc)
*
* @see com.sap.mi.textual.grammar.impl.IParsingObserver#notifyExitOperatorSequence()
*/
@Override
public void notifyExitOperatorSequence() {
result = "18";
}
@Override
public void notifyElementAddedToContext(Object element) {
result = "19";
}
@Override
public void notifyDelayedReferenceCreated(DelayedReference ref) {
result = "20";
}
@Override
public void notifyEnterInjectorAction() {
result = "21";
}
@Override
public void notifyExitInjectorAction() {
result = "22";
}
@Override
public void reset() {
result = "23";
}
}
/**
* Delegate to protected / private methods.
*/
private class TestableObservablePatchedParser extends ObservablePatchedParser {
@Override
public void onErrorInTemplateRule(RecognitionException re) {
super.onErrorInTemplateRule(re);
}
public TestableObservablePatchedParser(TokenStream input, RecognizerSharedState state) {
super(input, state);
}
@Override
public void onEnterTemplateRule(String templateURI) {
super.onEnterTemplateRule(templateURI);
}
@Override
public void onRuleElementCreationCommited(Object modelElement) {
super.onRuleElementCreationCommited(modelElement);
}
@Override
public void onRuleElementResolvedOutOfContext(Object modelElement, Object contextModelElement,
ANTLR3LocationToken referenceLocation, DelayedReference reference) {
super.onRuleElementResolvedOutOfContext(modelElement, contextModelElement, referenceLocation, reference);
}
@Override
public void onExitTemplateRule() {
super.onExitTemplateRule();
}
@Override
public void _beforeSeqEl() {
super._beforeSeqEl();
}
@Override
public void _afterSeqEl() {
super._afterSeqEl();
}
@Override
public void _enterAlt(int choice) {
super._enterAlt(choice);
}
@Override
public void _exitAlt() {
super._exitAlt();
}
}
}