blob: f1482fb898a05ec3b0a4a50933d1d8fa7024b5fa [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.debug;
import static org.junit.Assert.assertEquals;
import org.apache.harmony.jpda.tests.framework.jdwp.Value;
import org.junit.BeforeClass;
import org.junit.Test;
public class KotlinTest extends KotlinDebugTestBase {
private static KotlinD8Config d8Config;
@BeforeClass
public static void setup() {
d8Config = new KotlinD8Config(temp);
}
protected KotlinD8Config getD8Config() {
return d8Config;
}
// TODO(shertz) simplify test
// TODO(shertz) add more variables ?
@Test
public void testStepOver() throws Throwable {
runDebugTest(
getD8Config(),
"KotlinApp",
breakpoint("KotlinApp$Companion", "main"),
run(),
inspect(s -> {
assertEquals("KotlinApp$Companion", s.getClassName());
assertEquals("KotlinApp.kt", s.getSourceFile());
assertEquals(24, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
checkNoLocal("instance");
}),
stepOver(),
inspect(s -> {
assertEquals(25, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
s.checkLocal("instance");
}),
stepOver(),
inspect(s -> {
assertEquals(26, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
s.checkLocal("instance");
}),
run());
}
@Test
public void testStepIntoAndOut() throws Throwable {
runDebugTest(
getD8Config(),
"KotlinApp",
breakpoint("KotlinApp$Companion", "main"),
run(),
inspect(s -> {
assertEquals("KotlinApp$Companion", s.getClassName());
assertEquals("KotlinApp.kt", s.getSourceFile());
assertEquals(24, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
checkNoLocal("instance");
}),
stepOver(),
inspect(s -> {
assertEquals(25, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
s.checkLocal("instance");
}),
// Step into 1st invoke of ifElse
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals("KotlinApp.kt", s.getSourceFile());
assertEquals(8, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(true));
checkNoLocal("a");
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals(9, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(true));
s.checkLocal("a", Value.createInt(10));
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
// We should be into the 'then' statement.
assertEquals("KotlinApp", s.getClassName());
assertEquals(10, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(true));
s.checkLocal("a", Value.createInt(10));
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals(11, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(true));
s.checkLocal("a", Value.createInt(10));
s.checkLocal("b", Value.createInt(20));
checkNoLocal("c");
}),
// Go back to the main method
stepOut(),
inspect(s -> {
assertEquals("KotlinApp$Companion", s.getClassName());
assertEquals("KotlinApp.kt", s.getSourceFile());
assertEquals(26, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("args");
checkNoLocal("instance");
}),
// Step into 2nd invoke of ifElse
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals("KotlinApp.kt", s.getSourceFile());
assertEquals(8, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(false));
checkNoLocal("a");
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals(9, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(false));
s.checkLocal("a", Value.createInt(10));
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
// We should be into the 'else' statement this time.
assertEquals("KotlinApp", s.getClassName());
assertEquals(13, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(false));
s.checkLocal("a", Value.createInt(10));
checkNoLocal("b");
checkNoLocal("c");
}),
stepInto(),
inspect(s -> {
assertEquals("KotlinApp", s.getClassName());
assertEquals(14, s.getLineNumber());
s.checkLocal("this");
s.checkLocal("cond", Value.createBoolean(false));
s.checkLocal("a", Value.createInt(10));
checkNoLocal("b");
s.checkLocal("c", Value.createInt(5));
}),
run());
}
}