--- /dev/null
+package jp.sourceforge.stigmata.birthmarks.osb;\r
+\r
+import java.io.IOException;\r
+import java.net.URL;\r
+\r
+import jp.sourceforge.stigmata.Birthmark;\r
+import jp.sourceforge.stigmata.BirthmarkElement;\r
+import jp.sourceforge.stigmata.BirthmarkExtractionFailedException;\r
+import jp.sourceforge.stigmata.ExtractionUnit;\r
+import jp.sourceforge.stigmata.cflib.Opcode;\r
+import jp.sourceforge.stigmata.cflib.OpcodeManager;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+\r
+public class OperandStackBehaviorsBirthmarkExtractorTest{\r
+ private OperandStackBehaviorsBirthmarkExtractor extractor;\r
+\r
+ @Before\r
+ public void setUp(){\r
+ OperandStackBehaviorsBirthmarkService service = new OperandStackBehaviorsBirthmarkService();\r
+ extractor = (OperandStackBehaviorsBirthmarkExtractor)service.getExtractor();\r
+ }\r
+\r
+ @Test\r
+ public void testBasic(){\r
+ OperandStackBehaviorsBirthmarkElement element = \r
+ (OperandStackBehaviorsBirthmarkElement)extractor.buildElement("27, 28, 96, 62");\r
+\r
+ Assert.assertArrayEquals(\r
+ new ExtractionUnit[] { ExtractionUnit.CLASS, },\r
+ extractor.getAcceptableUnits()\r
+ );\r
+\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0));\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1));\r
+ Assert.assertEquals(Opcode.Category.ADD, element.getCategory(2));\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(3));\r
+\r
+ OpcodeManager manager = OpcodeManager.getInstance();\r
+ Assert.assertEquals(manager.getOpcode(27), element.getOpcode(0));\r
+ Assert.assertEquals(manager.getOpcode(28), element.getOpcode(1));\r
+ Assert.assertEquals(manager.getOpcode(96), element.getOpcode(2));\r
+ Assert.assertEquals(manager.getOpcode(62), element.getOpcode(3));\r
+ }\r
+\r
+ @Test\r
+ public void testExtract1() throws BirthmarkExtractionFailedException, IOException{\r
+ URL url = getClass().getResource("/resources/Sample1.class");\r
+ Birthmark birthmark = extractor.extract(url.openStream());\r
+\r
+ Assert.assertEquals("osb", birthmark.getType());\r
+ Assert.assertEquals(7, birthmark.getElementCount());\r
+\r
+ BirthmarkElement[] elements = birthmark.getElements();\r
+ OperandStackBehaviorsBirthmarkElement element = (OperandStackBehaviorsBirthmarkElement)elements[0];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0)); // aload_0\r
+ Assert.assertEquals(Opcode.Category.INVOKE, element.getCategory(1)); // invokespecial\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[1];\r
+ Assert.assertEquals(1, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.RETURN, element.getCategory(0)); // return\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[2];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.CONSTANT, element.getCategory(0)); // iconst_2\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(1)); // istore_1\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[3];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.CONSTANT, element.getCategory(0)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(1)); // istore_2\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[4];\r
+ Assert.assertEquals(4, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.ADD, element.getCategory(2)); // iadd\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(3)); // istore_3\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[5];\r
+ Assert.assertEquals(3, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.FIELD, element.getCategory(0)); // getstatic\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1)); // iload_3\r
+ Assert.assertEquals(Opcode.Category.INVOKE, element.getCategory(2)); // invokevirtual\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[6];\r
+ Assert.assertEquals(1, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.RETURN, element.getCategory(0)); // return\r
+ }\r
+\r
+ @Test\r
+ public void testExtract2() throws BirthmarkExtractionFailedException, IOException{\r
+ URL url = getClass().getResource("/resources/Sample2.class");\r
+ Birthmark birthmark = extractor.extract(url.openStream());\r
+\r
+ Assert.assertEquals("osb", birthmark.getType());\r
+ Assert.assertEquals(8, birthmark.getElementCount());\r
+\r
+ BirthmarkElement[] elements = birthmark.getElements();\r
+ OperandStackBehaviorsBirthmarkElement element = (OperandStackBehaviorsBirthmarkElement)elements[0];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0)); // aload_0\r
+ Assert.assertEquals(Opcode.Category.INVOKE, element.getCategory(1)); // invokespecial\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[1];\r
+ Assert.assertEquals(1, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.RETURN, element.getCategory(0)); // return\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[2];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.CONSTANT, element.getCategory(0)); // iconst_2\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(1)); // istore_1\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[3];\r
+ Assert.assertEquals(2, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.CONSTANT, element.getCategory(0)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(1)); // istore_2\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[4];\r
+ Assert.assertEquals(4, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1)); // iconst_4\r
+ Assert.assertEquals(Opcode.Category.ADD, element.getCategory(2)); // iadd\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(3)); // istore_3\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[5];\r
+ Assert.assertEquals(6, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(0));\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1));\r
+ Assert.assertEquals(Opcode.Category.MULTIPLY, element.getCategory(2));\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(3));\r
+ Assert.assertEquals(Opcode.Category.SUBTRACT, element.getCategory(4));\r
+ Assert.assertEquals(Opcode.Category.STORE, element.getCategory(5));\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[6];\r
+ Assert.assertEquals(3, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.FIELD, element.getCategory(0)); // getstatic\r
+ Assert.assertEquals(Opcode.Category.LOAD, element.getCategory(1)); // iload_3\r
+ Assert.assertEquals(Opcode.Category.INVOKE, element.getCategory(2)); // invokevirtual\r
+\r
+ element = (OperandStackBehaviorsBirthmarkElement)elements[7];\r
+ Assert.assertEquals(1, element.getLength());\r
+ Assert.assertEquals(Opcode.Category.RETURN, element.getCategory(0)); // return\r
+ }\r
+}\r