1111 *******************************************************************************/
1212package org .jacoco .core .internal .analysis .filter ;
1313
14- import static org .junit .Assert .assertEquals ;
15- import static org .junit .Assert .assertNull ;
16- import static org .junit .Assert .fail ;
17-
1814import java .util .HashSet ;
1915import java .util .Set ;
2016
2824/**
2925 * Unit tests for {@link StringSwitchEcjFilter}.
3026 */
31- public class StringSwitchEcjFilterTest {
27+ public class StringSwitchEcjFilterTest extends FilterTestBase {
3228
3329 private final IFilter filter = new StringSwitchEcjFilter ();
3430
35- private final FilterContextMock context = new FilterContextMock ();
36-
37- private AbstractInsnNode fromInclusive ;
38- private AbstractInsnNode toInclusive ;
39-
40- private AbstractInsnNode source ;
41- private Set <AbstractInsnNode > newTargets ;
42-
43- private final IFilterOutput output = new IFilterOutput () {
44- public void ignore (final AbstractInsnNode fromInclusive ,
45- final AbstractInsnNode toInclusive ) {
46- assertNull (StringSwitchEcjFilterTest .this .fromInclusive );
47- StringSwitchEcjFilterTest .this .fromInclusive = fromInclusive ;
48- StringSwitchEcjFilterTest .this .toInclusive = toInclusive ;
49- }
50-
51- public void merge (final AbstractInsnNode i1 ,
52- final AbstractInsnNode i2 ) {
53- fail ();
54- }
55-
56- public void replaceBranches (final AbstractInsnNode source ,
57- final Set <AbstractInsnNode > newTargets ) {
58- assertNull (StringSwitchEcjFilterTest .this .source );
59- StringSwitchEcjFilterTest .this .source = source ;
60- StringSwitchEcjFilterTest .this .newTargets = newTargets ;
61- }
62- };
63-
6431 @ Test
6532 public void should_filter () {
6633 final Set <AbstractInsnNode > expectedNewTargets = new HashSet <AbstractInsnNode >();
@@ -81,9 +48,9 @@ public void should_filter() {
8148 m .visitMethodInsn (Opcodes .INVOKEVIRTUAL , "java/lang/String" , "hashCode" ,
8249 "()I" , false );
8350 m .visitTableSwitchInsn (97 , 98 , caseDefault , h1 , h2 );
51+ final AbstractInsnNode switchNode = m .instructions .getLast ();
8452
8553 m .visitLabel (h1 );
86- final AbstractInsnNode expectedFromInclusive = m .instructions .getLast ();
8754
8855 m .visitVarInsn (Opcodes .ALOAD , 2 );
8956 m .visitLdcInsn ("a" );
@@ -115,9 +82,6 @@ public void should_filter() {
11582 m .visitJumpInsn (Opcodes .GOTO , caseDefault );
11683 final AbstractInsnNode expectedToInclusive = m .instructions .getLast ();
11784
118- m .visitLabel (caseDefault );
119- m .visitInsn (Opcodes .RETURN );
120- expectedNewTargets .add (m .instructions .getLast ());
12185 m .visitLabel (case1 );
12286 m .visitInsn (Opcodes .RETURN );
12387 expectedNewTargets .add (m .instructions .getLast ());
@@ -127,13 +91,58 @@ public void should_filter() {
12791 m .visitLabel (case3 );
12892 m .visitInsn (Opcodes .RETURN );
12993 expectedNewTargets .add (m .instructions .getLast ());
94+ m .visitLabel (caseDefault );
95+ m .visitInsn (Opcodes .RETURN );
96+ expectedNewTargets .add (m .instructions .getLast ());
97+
98+ filter .filter (m , context , output );
99+
100+ assertReplacedBranches (switchNode , expectedNewTargets );
101+ assertIgnored (new Range (switchNode .getNext (), expectedToInclusive ));
102+ }
103+
104+ @ Test
105+ public void should_filter_when_default_is_first () {
106+ final Set <AbstractInsnNode > expectedNewTargets = new HashSet <AbstractInsnNode >();
107+
108+ final MethodNode m = new MethodNode (InstrSupport .ASM_API_VERSION , 0 ,
109+ "name" , "()V" , null , null );
110+
111+ final Label case1 = new Label ();
112+ final Label caseDefault = new Label ();
113+ final Label h1 = new Label ();
114+
115+ m .visitVarInsn (Opcodes .ALOAD , 1 );
116+
117+ m .visitVarInsn (Opcodes .ASTORE , 2 );
118+ m .visitMethodInsn (Opcodes .INVOKEVIRTUAL , "java/lang/String" , "hashCode" ,
119+ "()I" , false );
120+ m .visitLookupSwitchInsn (caseDefault , new int [] { 97 },
121+ new Label [] { h1 });
122+ final AbstractInsnNode switchNode = m .instructions .getLast ();
123+
124+ m .visitLabel (h1 );
125+
126+ m .visitVarInsn (Opcodes .ALOAD , 2 );
127+ m .visitLdcInsn ("a" );
128+ m .visitMethodInsn (Opcodes .INVOKEVIRTUAL , "java/lang/String" , "equals" ,
129+ "(Ljava/lang/Object;)Z" , false );
130+ // if equal "a", then goto its case
131+ m .visitJumpInsn (Opcodes .IFNE , case1 );
132+
133+ final AbstractInsnNode expectedToInclusive = m .instructions .getLast ();
134+
135+ m .visitLabel (caseDefault );
136+ m .visitInsn (Opcodes .RETURN );
137+ expectedNewTargets .add (m .instructions .getLast ());
138+ m .visitLabel (case1 );
139+ m .visitInsn (Opcodes .RETURN );
140+ expectedNewTargets .add (m .instructions .getLast ());
130141
131142 filter .filter (m , context , output );
132143
133- assertEquals (expectedFromInclusive .getPrevious (), source );
134- assertEquals (expectedNewTargets , newTargets );
135- assertEquals (expectedFromInclusive , fromInclusive );
136- assertEquals (expectedToInclusive , toInclusive );
144+ assertReplacedBranches (switchNode , expectedNewTargets );
145+ assertIgnored (new Range (switchNode .getNext (), expectedToInclusive ));
137146 }
138147
139148}
0 commit comments