| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * 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 com.android.jack.cfg; |
| |
| |
| import com.android.jack.Options; |
| import com.android.jack.TestTools; |
| import com.android.jack.ir.ast.JAsgOperation; |
| import com.android.jack.ir.ast.JExpressionStatement; |
| import com.android.jack.ir.ast.JIfStatement; |
| import com.android.jack.ir.ast.JMethod; |
| import com.android.jack.ir.ast.JStatement; |
| import com.android.jack.util.filter.SignatureMethodFilter; |
| |
| import junit.framework.Assert; |
| |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| import java.io.File; |
| import java.util.List; |
| |
| public class BuildCfgTest { |
| |
| private List<BasicBlock> bbCodeOder; |
| private static final String CLASS_BINARY_NAME = "com/android/jack/fibonacci/jack/FibonacciThreeAddress"; |
| |
| @Before |
| public void setUp() throws Exception { |
| BuildCfgTest.class.getClassLoader().setDefaultAssertionStatus(true); |
| |
| String classSignature = "L" + CLASS_BINARY_NAME + ";"; |
| File fileName = TestTools.getJackTestFromBinaryName(CLASS_BINARY_NAME); |
| final String methodSignature = "fibonacci(I)I"; |
| Options commandLineArgs = TestTools.buildCommandLineArgs(fileName); |
| commandLineArgs.addProperty(Options.METHOD_FILTER.getName(), "method-with-signature"); |
| commandLineArgs.addProperty(SignatureMethodFilter.METHOD_SIGNATURE_FILTER.getName(), |
| methodSignature); |
| |
| JMethod method = CfgTools.buildCfg(classSignature, methodSignature, commandLineArgs); |
| |
| ControlFlowGraph cfg = method.getMarker(ControlFlowGraph.class); |
| assert cfg != null; |
| |
| bbCodeOder = cfg.getNodes(); |
| } |
| |
| @Test |
| public void cfg001() throws Exception { |
| Assert.assertEquals(6, bbCodeOder.size()); |
| Assert.assertEquals(true, bbCodeOder.get(1).getLastInstruction() instanceof JIfStatement); |
| Assert.assertEquals(2, bbCodeOder.get(1).getSuccessors().size()); |
| JStatement lastInstruction = bbCodeOder.get(3).getLastInstruction(); |
| Assert.assertEquals(true, |
| lastInstruction instanceof JExpressionStatement); |
| Assert.assertTrue( |
| ((JExpressionStatement) lastInstruction).getExpr() instanceof JAsgOperation); |
| Assert.assertEquals(true, |
| bbCodeOder.get(4).getLastInstruction() instanceof JExpressionStatement); |
| } |
| |
| @Test |
| public void cfg002() throws Exception { |
| for (BasicBlock bb : bbCodeOder) { |
| for (BasicBlock succ : bb.getSuccessors()) { |
| Assert.assertTrue(succ.getPredecessors().contains(bb)); |
| } |
| } |
| } |
| } |