package io.flutter.plugin.mouse;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.annotation.TargetApi;
import android.app.Activity;
import android.view.PointerIcon;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import io.flutter.embedding.android.FlutterView;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.embedding.engine.systemchannels.MouseCursorChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import java.util.HashMap;
import org.json.JSONException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;

@Config(
    manifest = Config.NONE,
    minSdk = 24,
    shadows = {})
@RunWith(AndroidJUnit4.class)
@TargetApi(24)
public class MouseCursorPluginTest {

  @SuppressWarnings("deprecation")
  // Robolectric.setupActivity.
  // TODO(reidbaker): https://github.com/flutter/flutter/issues/133151
  @Test
  public void mouseCursorPlugin_SetsSystemCursorOnRequest() throws JSONException {
    // Migrate to ActivityScenario by following https://github.com/robolectric/robolectric/pull/4736
    // Initialize a general MouseCursorPlugin.
    FlutterView testView = spy(new FlutterView(Robolectric.setupActivity(Activity.class)));
    MouseCursorChannel mouseCursorChannel = new MouseCursorChannel(mock(DartExecutor.class));

    MouseCursorPlugin mouseCursorPlugin = new MouseCursorPlugin(testView, mouseCursorChannel);

    final StoredResult methodResult = new StoredResult();
    mouseCursorChannel.synthesizeMethodCall(
        new MethodCall(
            "activateSystemCursor",
            new HashMap<String, Object>() {
              private static final long serialVersionUID = 1L;

              {
                put("device", 1);
                put("kind", "text");
              }
            }),
        methodResult);
    verify(testView, times(1)).getSystemPointerIcon(PointerIcon.TYPE_TEXT);
    verify(testView, times(1)).setPointerIcon(any(PointerIcon.class));
    assertEquals(methodResult.result, Boolean.TRUE);
  }
}

class StoredResult implements MethodChannel.Result {
  Object result;

  @Override
  public void success(Object result) {
    this.result = result;
  }

  @Override
  public void error(String errorCode, String errorMessage, Object errorDetails) {}

  @Override
  public void notImplemented() {}
}
