// Copyright (c) 2022, 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 varhandle;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;

public class ArrayOfInt {

  private static void checkJavaLangInvokeWrongMethodTypeException(RuntimeException e) {
    if (e.getClass().getCanonicalName().equals("java.lang.invoke.WrongMethodTypeException")
        || e.getMessage().equals("java.lang.invoke.WrongMethodTypeException")) {
      return;
    }
    throw e;
  }

  public static void testGet() {
    System.out.println("testGet");
    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];

    arrayVarHandle.set(array, 0, 1);
    arrayVarHandle.set(array, 1, 2);

    System.out.println(arrayVarHandle.get(array, 0));
    System.out.println(arrayVarHandle.get(array, 1));
    System.out.println((Object) arrayVarHandle.get(array, 0));
    System.out.println((Object) arrayVarHandle.get(array, 1));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    System.out.println((long) arrayVarHandle.get(array, 0));
    System.out.println((long) arrayVarHandle.get(array, 1));
    System.out.println((float) arrayVarHandle.get(array, 0));
    System.out.println((float) arrayVarHandle.get(array, 1));
    System.out.println((double) arrayVarHandle.get(array, 0));
    System.out.println((double) arrayVarHandle.get(array, 1));
    try {
      System.out.println((boolean) arrayVarHandle.get(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((boolean) arrayVarHandle.get(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((byte) arrayVarHandle.get(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((byte) arrayVarHandle.get(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((short) arrayVarHandle.get(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((short) arrayVarHandle.get(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((char) arrayVarHandle.get(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((char) arrayVarHandle.get(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((String) arrayVarHandle.get(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((String) arrayVarHandle.get(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
  }

  public static void testGetVolatile() {
    System.out.println("testGetVolatile");
    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];

    arrayVarHandle.set(array, 0, 1);
    arrayVarHandle.set(array, 1, 2);

    System.out.println(arrayVarHandle.getVolatile(array, 0));
    System.out.println(arrayVarHandle.getVolatile(array, 1));
    System.out.println((Object) arrayVarHandle.getVolatile(array, 0));
    System.out.println((Object) arrayVarHandle.getVolatile(array, 1));
    System.out.println((int) arrayVarHandle.getVolatile(array, 0));
    System.out.println((int) arrayVarHandle.getVolatile(array, 1));
    System.out.println((long) arrayVarHandle.getVolatile(array, 0));
    System.out.println((long) arrayVarHandle.getVolatile(array, 1));
    System.out.println((float) arrayVarHandle.getVolatile(array, 0));
    System.out.println((float) arrayVarHandle.getVolatile(array, 1));
    System.out.println((double) arrayVarHandle.getVolatile(array, 0));
    System.out.println((double) arrayVarHandle.getVolatile(array, 1));
    try {
      System.out.println((boolean) arrayVarHandle.getVolatile(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((boolean) arrayVarHandle.getVolatile(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((byte) arrayVarHandle.getVolatile(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((byte) arrayVarHandle.getVolatile(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((short) arrayVarHandle.getVolatile(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((short) arrayVarHandle.getVolatile(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((char) arrayVarHandle.getVolatile(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((char) arrayVarHandle.getVolatile(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((String) arrayVarHandle.getVolatile(array, 0));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
    try {
      System.out.println((String) arrayVarHandle.getVolatile(array, 1));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
    }
  }

  public static void testSet() {
    System.out.println("testSet");

    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];

    // int and Integer values.
    arrayVarHandle.set(array, 0, 1);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, 2);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, Integer.valueOf(3));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, Integer.valueOf(4));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer compatible values.
    arrayVarHandle.set(array, 0, (byte) 5);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, (byte) 6);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, Byte.valueOf((byte) 7));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, Byte.valueOf((byte) 8));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, '0');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, '1');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, Character.valueOf('2'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, Character.valueOf('3'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, (short) 9);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, (short) 10);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 0, Short.valueOf((short) 11));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.set(array, 1, Short.valueOf((short) 12));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer non-compatible values.
    try {
      arrayVarHandle.set(array, 0, true);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, 13L);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, Long.valueOf(13L));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, 1.3f);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, Float.valueOf(1.3f));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, 1.4);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, Double.valueOf(1.4));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, new Object());
      System.out.println("Unexpected success");
    } catch (ClassCastException e) {
      // The reference implementation throws ClassCastException.
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    } catch (RuntimeException e) {
      // The Art and desugaring throws WrongMethodTypeException.
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.set(array, 0, "X");
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
  }

  public static void testSetVolatile() {
    System.out.println("testSetVolatile");

    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];

    // int and Integer values.
    arrayVarHandle.setVolatile(array, 0, 1);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, 2);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, Integer.valueOf(3));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, Integer.valueOf(4));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer compatible values.
    arrayVarHandle.setVolatile(array, 0, (byte) 5);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, (byte) 6);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, Byte.valueOf((byte) 7));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, Byte.valueOf((byte) 8));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, '0');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, '1');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, Character.valueOf('2'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, Character.valueOf('3'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, (short) 9);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, (short) 10);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 0, Short.valueOf((short) 11));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setVolatile(array, 1, Short.valueOf((short) 12));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer non-compatible values.
    try {
      arrayVarHandle.setVolatile(array, 0, true);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, 13L);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, Long.valueOf(13L));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, 1.3f);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, Float.valueOf(1.3f));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, 1.4);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, Double.valueOf(1.4));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, new Object());
      System.out.println("Unexpected success");
    } catch (ClassCastException e) {
      // The reference implementation throws ClassCastException.
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    } catch (RuntimeException e) {
      // The Art and desugaring throws WrongMethodTypeException.
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setVolatile(array, 0, "X");
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
  }

  public static void testSetRelease() {
    System.out.println("testSetRelease");

    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];

    // int and Integer values.
    arrayVarHandle.setRelease(array, 0, 1);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, 2);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, Integer.valueOf(3));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, Integer.valueOf(4));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer compatible values.
    arrayVarHandle.setRelease(array, 0, (byte) 5);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, (byte) 6);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, Byte.valueOf((byte) 7));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, Byte.valueOf((byte) 8));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, '0');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, '1');
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, Character.valueOf('2'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, Character.valueOf('3'));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, (short) 9);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, (short) 10);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 0, Short.valueOf((short) 11));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.setRelease(array, 1, Short.valueOf((short) 12));
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));

    // int and Integer non-compatible values.
    try {
      arrayVarHandle.setRelease(array, 0, true);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, 13L);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, Long.valueOf(13L));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, 1.3f);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, Float.valueOf(1.3f));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, 1.4);
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, Double.valueOf(1.4));
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, new Object());
      System.out.println("Unexpected success");
    } catch (ClassCastException e) {
      // The reference implementation throws ClassCastException.
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    } catch (RuntimeException e) {
      // The Art and desugaring throws WrongMethodTypeException.
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
    try {
      arrayVarHandle.setRelease(array, 0, "X");
      System.out.println("Unexpected success");
    } catch (RuntimeException e) {
      checkJavaLangInvokeWrongMethodTypeException(e);
      System.out.println((int) arrayVarHandle.get(array, 0));
      System.out.println((int) arrayVarHandle.get(array, 1));
    }
  }

  public static void testCompareAndSet() {
    System.out.println("testCompareAndSet");

    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];
    arrayVarHandle.set(array, 0, 1);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.compareAndSet(array, 1, 1, 3);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.compareAndSet(array, 1, 0, 2);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    // TODO(b/247076137): Handle boxed.
    // arrayVarHandle.compareAndSet(array, 1, 2, box(3));
    arrayVarHandle.compareAndSet(array, 1, 2, 3);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
  }

  // This test is not testing weakCompareAndSet behaviour, but assuming it behaves like
  // compareAndSet, that is without any spurious failures. This is the desugaring behaviour, as
  // as there is no weakCompareAndSet primitive in sun.misc.Unsafe, only compareAndSwapXXX.
  public static void testWeakCompareAndSet() {
    System.out.println("testWeakCompareAndSet");

    VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
    int[] array = new int[2];
    arrayVarHandle.set(array, 0, 1);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.weakCompareAndSet(array, 1, 1, 3);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    arrayVarHandle.weakCompareAndSet(array, 1, 0, 2);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
    // TODO(b/247076137): Handle boxed.
    // arrayVarHandle.waekCompareAndSet(array, 1, 2, box(3));
    arrayVarHandle.weakCompareAndSet(array, 1, 2, 3);
    System.out.println((int) arrayVarHandle.get(array, 0));
    System.out.println((int) arrayVarHandle.get(array, 1));
  }

  public static void testArrayVarHandleForNonSingleDimension() {
    System.out.println("testArrayVarHandleForNonSingleDimension");
    try {
      MethodHandles.arrayElementVarHandle(int.class);
      System.out.println("Unexpected success");
    } catch (IllegalArgumentException e) {
      System.out.println("IllegalArgumentException");
    }
    try {
      MethodHandles.arrayElementVarHandle(int[][].class);
      System.out.println("Got array element VarHandle");
    } catch (UnsupportedOperationException e) {
      System.out.println("UnsupportedOperationException");
    }
  }

  public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    testGet();
    testGetVolatile();
    testSet();
    testSetVolatile();
    testSetRelease();
    testCompareAndSet();
    testWeakCompareAndSet();
    testArrayVarHandleForNonSingleDimension();
  }
}
