/** * */ package com.sap.ide.cts.parser.incremental; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import ngpm.NgpmPackage; import org.junit.Ignore; import org.junit.Test; import textblocks.AbstractToken; import textblocks.TextBlock; import textblocks.VersionEnum; import behavioral.actions.Block; import com.sap.ap.cts.monet.parser.ActionsParserFactory; import com.sap.ide.cts.parser.incremental.antlr.IncrementalParserFacade; import com.sap.mi.textual.parsing.textblocks.TbChangeUtil; import com.sap.mi.textual.parsing.textblocks.TbVersionUtil; import com.sap.mi.textual.parsing.textblocks.TextBlocksAwareModelAdapter; import com.sap.mi.textual.textblocks.model.TextBlocksModel; import com.sap.tc.moin.repository.Moin; import com.sap.tc.moin.repository.PRI; import com.sap.tc.moin.textual.moinadapter.adapter.MOINModelAdapter; /** * */ public class TestParsingObserverWithActionsSyntax extends NGPMTextBlockTest { private static class Replacement { int offset; int length; String conent; public Replacement(int offset, int length, String conent) { super(); this.offset = offset; this.length = length; this.conent = conent; } } @Test @Ignore public void test1() throws Exception { IncrementalParserFacade facade = getParserFacade(); File Test1 = new File("scenariotestResource/ActionsTest.act"); AbstractToken content = createToken(""); TextBlock root = initialiseTextBlocksWithContentToken(content); TextBlocksModel tbModel = new TextBlocksModel(root, null); tbModel.replace(0, 0, getActionsFileContent(Test1)); Object blockObject = facade.parse(root, "main"); // assert no exception assertNotNull(blockObject); assertTrue(blockObject instanceof Block); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version //assertEquals(15, currentVersionTb.getSubNodes().size()); } @Test public void test2() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return 0;}"; //add space to return statement afterwards: //{return 0;} Replacement replacement = new Replacement(7,0," "); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test3() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return this.length(123);}"; //add space to return statement afterwards: //{return this.length (123);} Replacement replacement = new Replacement(19,0," "); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test4() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return 0;}"; //add space to return statement afterwards: //{return this.length();} Replacement replacement = new Replacement(8,1,"this.length()"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test5() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return 0;}"; //add space to return statement afterwards: //{return 10;} Replacement replacement = new Replacement(8,0,"1"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test6() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return 10;}"; //add space to return statement afterwards: //{return 100;} Replacement replacement = new Replacement(10,0,"0"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test7() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return 100;}"; //add space to return statement afterwards: //{return this;} Replacement replacement = new Replacement(8,3,"this"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test8() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{return this.length();}"; //how the text should look afterwards: //{return this.length(123);} Replacement replacement = new Replacement(20,0,"123"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test9() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{this.length();}"; //how the text should look afterwards: //{this; //this.length()} Replacement replacement = new Replacement(1,0,"this;\n"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test10() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{this.length(0);}"; //how the text should look afterwards: //{this.length();} Replacement replacement = new Replacement(13,1,""); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test11() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{this.length();}"; //how the text should look afterwards: //{this.length();} Replacement replacement = new Replacement(13,0,"1"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test12() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{\nthis;\n}"; //how the text should look afterwards: //{ //this; //this; //;} Replacement replacement = new Replacement(1,0,"this;\n"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version } @Test public void test13() { IncrementalParserFacade facade = getParserFacade(); String initialConent = "{\nthis;\n}"; //how the text should look afterwards: //{ //this; //this; //;} Replacement replacement = new Replacement(1,0,"this;\n"); TextBlock root = doReplacementWithInitialContent(facade, initialConent, replacement); TextBlock currentVersionTb = TbVersionUtil.getOtherVersion(root, VersionEnum.CURRENT); assertNotNull(currentVersionTb); // future version TbChangeUtil.cleanUp(currentVersionTb); replacement = new Replacement(1,0,"this;\n"); root = doReplacement(facade, replacement, currentVersionTb); assertNotNull(root); } private TextBlock doReplacementWithInitialContent(IncrementalParserFacade facade, String initialConent, Replacement replacement) { AbstractToken content = createToken( initialConent); TextBlock root = initialiseTextBlocksWithContentToken(content); return doReplacement(facade, replacement, root); } private TextBlock doReplacement(IncrementalParserFacade facade, Replacement replacement, TextBlock root) { TextBlocksModel tbModel = new TextBlocksModel(root, null); tbModel.replace(replacement.offset, replacement.length, replacement.conent); TextBlock result = facade.parseIncrementally(root); Object blockObject = IncrementalParserFacade.getParsingResult(result); if(facade.getErrors().size() > 0) { if(facade.getErrors().get(0).getMessage().startsWith("Cannot evaluate OCLExpression")) { } else { //FAIL assertNotNull(facade.getErrors().size() + " Errors occured, first is:"+ facade.getErrors().get(0).getMessage(), null); } } // assert no exception assertNotNull(blockObject); assertTrue(blockObject instanceof Block); return result; } /** * @return * @throws InstantiationException * @throws IllegalAccessException * @throws InvocationTargetException * @throws NoSuchMethodException */ private IncrementalParserFacade getParserFacade() { NgpmPackage ngpmPackage = connection .getPackage(NgpmPackage.PACKAGE_DESCRIPTOR); Collection<PRI> priList = new ArrayList<PRI>(); Moin moin = getBuildMoin(); PRI pri1 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/tc/moin/mof_1.4/_comp/moin/meta/PrimitiveTypes.moinmm"); PRI pri2 = moin.createPri("PF.MetaModelDataArea:DCs/demo.sap.com/tcsmeta/_comp/moin/meta/Metamodel.moinmm"); PRI pri3 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/tc/moin/mof_1.4/_comp/moin/meta/Model.moinmm"); PRI pri4 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/tc/moin/mof_1.4/_comp/moin/meta/MOIN.moinmm"); PRI pri5 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/moin/mm/ap/core/_comp/moin/meta/ngpm.moinmm"); PRI pri6 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/moin/mm/ap/core/_comp/moin/meta/data.moinmm"); PRI pri7 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/moin/mm/ap/core/_comp/moin/meta/behavioral.moinmm"); PRI pri8 = moin.createPri("PF.MetaModelDataArea:DCs/sap.com/moin/mm/ap/core/_comp/moin/meta/dataaccess.moinmm"); priList.add(pri1); priList.add(pri2); priList.add(pri3); priList.add(pri4); priList.add(pri5); priList.add(pri6); priList.add(pri7); priList.add(pri8); IncrementalParserFacade facade = new IncrementalParserFacade( new ActionsParserFactory(), new TextBlocksAwareModelAdapter(new MOINModelAdapter( ngpmPackage, connection, priList, null)), connection, null); return facade; } private String getActionsFileContent(File syntaxDefFile) { String content = null; if (syntaxDefFile != null) { try { FileInputStream inputStream = new FileInputStream(syntaxDefFile); StringBuilder out = new StringBuilder(); byte[] b = new byte[4096]; for (int n; (n = inputStream.read(b)) != -1;) { out.append(new String(b, 0, n)); } content = out.toString(); inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } return content; } }