Skip to content

Commit

Permalink
(WIP) add unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
Godin committed Apr 6, 2021
1 parent 7ee6638 commit 02f4f3d
Showing 1 changed file with 113 additions and 0 deletions.
Expand Up @@ -156,6 +156,119 @@ public void should_filter_when_default_is_first() {
assertIgnored(new Range(switchNode.getNext(), expectedToInclusive));
}

/**
* <pre>
* fun example(p: String) {
* when (p) {
* "a" -> return
* "\u0000a" -> return
* "b" -> return
* "\u0000b" -> return
* "c" -> return
* "\u0000c" -> return
* }
* }
* </pre>
*/
@Test
public void should_filter_Kotlin_1_5() {
final Set<AbstractInsnNode> expectedNewTargets = new HashSet<AbstractInsnNode>();

final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
"example", "()V", null, null);

final Label h1 = new Label();
final Label h2 = new Label();
final Label h3 = new Label();
final Label defaultCase = new Label();
final Label case1 = new Label();
final Label case2 = new Label();
final Label case3 = new Label();
final Label case4 = new Label();
final Label case5 = new Label();
final Label case6 = new Label();

m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "hashCode",
"()I", false);
m.visitTableSwitchInsn(97, 99, defaultCase, h1, h2, h3);

m.visitLabel(h1);
final AbstractInsnNode expectedFromInclusive = m.instructions.getLast();
m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("a");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case1);

m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("\u0000a");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case2);

m.visitJumpInsn(Opcodes.GOTO, defaultCase);

m.visitLabel(h2);
m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("b");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case3);

m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("\u0000b");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case4);

m.visitJumpInsn(Opcodes.GOTO, defaultCase);

m.visitLabel(h3);
m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("c");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case5);

m.visitVarInsn(Opcodes.ALOAD, 1);
m.visitLdcInsn("\u0000c");
m.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "equals",
"(Ljava/lang/Object;)Z", false);
m.visitJumpInsn(Opcodes.IFNE, case6);

m.visitJumpInsn(Opcodes.GOTO, defaultCase);
final AbstractInsnNode expectedToInclusive = m.instructions.getLast();

m.visitLabel(case1);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(case2);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(case3);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(case4);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(case5);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(case6);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());
m.visitLabel(defaultCase);
m.visitInsn(Opcodes.RETURN);
expectedNewTargets.add(m.instructions.getLast());

filter.filter(m, context, output);

assertIgnored(new Range(expectedFromInclusive, expectedToInclusive));
assertReplacedBranches(expectedFromInclusive.getPrevious(),
expectedNewTargets);
}

@Test
public void should_not_filter_empty_lookup_switch() {
final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
Expand Down

0 comments on commit 02f4f3d

Please sign in to comment.