/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.dataFlow.lang; import org.junit.Test; import org.junit.Assert; import jetbrains.mps.lang.dataFlow.framework.analyzers.ReachabilityAnalyzer; import jetbrains.mps.lang.dataFlow.framework.AnalysisResult; import jetbrains.mps.lang.dataFlow.framework.Program; import jetbrains.mps.lang.dataFlow.framework.SimpleProgramBuilder; public class ReachabilityAnaysisTest { @Test public void simple() { Program program = new SimpleProgramBuilder() .emitJump(2) .emitNop() .emitNop() .buildProgram(); AnalysisResult<Boolean> result = program.analyze(new ReachabilityAnalyzer()); Assert.assertEquals( "0: jump 2 true\n" + "1: nop false\n" + "2: nop true\n" + "3: end true\n", result.toString() ); } @Test public void simpleTryFinally() { Program p = new SimpleProgramBuilder() .emitTry() .emitFinally() .emitEndTry() .emitNop() .buildProgram(); AnalysisResult<Boolean> result = p.analyze(new ReachabilityAnalyzer()); Assert.assertEquals( "0: try true\n" + "1: finally true\n" + "2: endTry true\n" + "3: nop true\n" + "4: end true\n", result.toString() ); } @Test public void simpleTryFinallyWithReturn() { Program p = new SimpleProgramBuilder() .emitTry() .emitRet() .emitFinally() .emitEndTry() .buildProgram(); AnalysisResult<Boolean> result = p.analyze(new ReachabilityAnalyzer()); Assert.assertEquals( "0: try true\n" + "1: ret true\n" + "2: finally true\n" + "3: endTry true\n" + "4: end true\n", result.toString() ); } @Test public void unreachableAfterFinally() { Program p = new SimpleProgramBuilder() .emitTry() .emitRet() .emitFinally() .emitEndTry() .emitNop() .buildProgram(); AnalysisResult<Boolean> result = p.analyze(new ReachabilityAnalyzer()); Assert.assertEquals( "0: try true\n" + "1: ret true\n" + "2: finally true\n" + "3: endTry true\n" + "4: nop false\n" + "5: end true\n", result.toString() ); } @Test public void nestedTries() { Program p = new SimpleProgramBuilder() .emitTry() .emitTry() .emitRet() .emitFinally() .emitEndTry() .emitNop() .emitFinally() .emitEndTry() .emitNop() .buildProgram(); AnalysisResult<Boolean> result = p.analyze(new ReachabilityAnalyzer()); Assert.assertEquals( "0: try true\n" + "1: try true\n" + "2: ret true\n" + "3: finally true\n" + "4: endTry true\n" + "5: nop false\n" + "6: finally true\n" + "7: endTry true\n" + "8: nop false\n" + "9: end true\n", result.toString() ); } }