// 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.smali;

import static org.junit.Assert.assertTrue;

import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;

public class Regress38014736 extends SmaliTestBase {

  @Test
  public void handlerRangeStartingOnMoveResult() throws Exception {
    SmaliBuilder builder = new SmaliBuilder(DEFAULT_CLASS_NAME);

    builder.addMainMethod(
        2,
        "new-instance        v1, Ljava/lang/Integer;",
        "const/4             v0, 0x00",
        "invoke-direct       { v1, v0 }, Ljava/lang/Integer;-><init>(I)V",
        "invoke-virtual      { v1 }, Ljava/lang/Integer;->intValue()I",
        "move-result         v1",
        "invoke-static       { v1 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;",
        "move-result-object  v1",
        "invoke-virtual      { v1 }, Ljava/lang/Integer;->intValue()I",
        ":try_start", // The try block starts on the move result instruction.
        "move-result         v1",
        "sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;",
        "invoke-virtual      { v0, v1 }, Ljava/io/PrintStream;->println(I)V",
        "const/4             v1, 0x00  # 0",
        "invoke-static       { v1 }, "
            + "Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;",
        "move-result-object  v1",
        "invoke-virtual      { v1 }, Ljava/lang/Integer;->intValue()I",
        ":try_end", // The try block ends on the move result instruction.
        "move-result         v1",
        "sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;",
        "invoke-virtual      { v0, v1 }, Ljava/io/PrintStream;->println(I)V",
        ".catch Ljava/lang/NumberFormatException; {:try_start .. :try_end} :catch_block",
        "return-void",
        ":catch_block",
        "move-exception      v1",
        "sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;",
        "invoke-virtual      { v0, v1 }, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V",
        "return-void");

    AndroidApp originalApplication = buildApplication(builder);
    AndroidApp processedApplication = processApplication(originalApplication);
    String result = runArt(processedApplication);
    // The art runtime changed the way exceptions are printed. Therefore, we only check
    // for the type of the exception and that the message mentions null.
    assertTrue(result.startsWith(StringUtils.joinLines("0", "java.lang.NumberFormatException:")));
    assertTrue(result.contains("null"));
  }
}
