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

import static org.junit.Assert.assertEquals;

import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
import com.google.common.collect.ImmutableList;
import org.junit.Test;

public class FillBooleanArrayTruncation extends JasminTestBase {

  private void runOnDalvikCheckVerifyError(JasminBuilder builder, String main) throws Exception {
    try {
      runOnArtD8(builder, main);
    } catch (AssertionError e) {
      assert e.toString().contains("VerifyError");
    }
  }

  private void runOnDalvikDxCheckVerifyError(JasminBuilder builder, String main) throws Exception {
    try {
      runOnArtDx(builder, main);
    } catch (AssertionError e) {
      assert e.toString().contains("VerifyError");
    }
  }

  private void runTest(JasminBuilder builder, String main) throws Exception {
    String javaResult = runOnJava(builder, main);
    if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(DexVm.Version.V4_4_4)) {
      // On dalvik the need for truncation is treated as a verification error.
      runOnDalvikCheckVerifyError(builder, main);
      runOnDalvikDxCheckVerifyError(builder, main);
    } else {
      String artResult = runOnArtD8(builder, main);
      assertEquals(javaResult, artResult);
      String dxArtResult = runOnArtDx(builder, main);
      assertEquals(javaResult, dxArtResult);
    }
  }

  @Test
  public void filledArray() throws Exception {
    JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4);
    JasminBuilder.ClassBuilder clazz = builder.addClass("Test");

    // Corresponds to something like the following (which doesn't compile with javac):
    //
    // public static void foo() {
    //   byte[] bytes = new byte[5];
    //   bytes[0] = 257;
    //   bytes[1] = -257;
    //   bytes[2] = 88;
    //   bytes[3] = 129;
    //   bytes[4] = -129;
    //   for (int i = 0; i < bytes.length; i++) {
    //     System.out.println(bytes[i]);
    //   }
    // }
    clazz.addStaticMethod("foo", ImmutableList.of(), "V",
        ".limit stack 10",
        ".limit locals 10",
        "  iconst_5",
        "  newarray byte",
        "  astore_0",
        "  aload_0",
        "  iconst_0",
        "  sipush 257",
        "  bastore",
        "  aload_0",
        "  iconst_1",
        "  sipush -257",
        "  bastore",
        "  aload_0",
        "  iconst_2",
        "  bipush 88",
        "  bastore",
        "  aload_0",
        "  iconst_3",
        "  sipush 129",
        "  bastore",
        "  aload_0",
        "  iconst_4",
        "  sipush -129",
        "  bastore",
        "  iconst_0",
        "  istore_1",
        "PrintLoop:",
        "  iload_1",
        "  aload_0",
        "  arraylength",
        "  if_icmpge Return",
        "  getstatic  java/lang/System.out Ljava/io/PrintStream;",
        "  aload_0",
        "  iload_1",
        "  baload",
        "  invokevirtual java/io/PrintStream.println(I)V",
        "  iinc 1 1",
        "  goto          PrintLoop",
        "Return:",
        "  return");

    // public static void main(String args[]) {
    //   foo();
    // }
    clazz.addMainMethod(
        ".limit stack 2",
        ".limit locals 10",
        "  invokestatic Test/foo()V",
        "  return");

    runTest(builder, clazz.name);
  }
}
