// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:device_info_platform_interface/device_info_platform_interface.dart';
import 'package:device_info_platform_interface/method_channel/method_channel_device_info.dart';

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  group("$MethodChannelDeviceInfo", () {
    late MethodChannelDeviceInfo methodChannelDeviceInfo;

    setUp(() async {
      methodChannelDeviceInfo = MethodChannelDeviceInfo();

      methodChannelDeviceInfo.channel
          .setMockMethodCallHandler((MethodCall methodCall) async {
        switch (methodCall.method) {
          case 'getAndroidDeviceInfo':
            return ({
              "version": <String, dynamic>{
                "securityPatch": "2018-09-05",
                "sdkInt": 28,
                "release": "9",
                "previewSdkInt": 0,
                "incremental": "5124027",
                "codename": "REL",
                "baseOS": "",
              },
              "board": "goldfish_x86_64",
              "bootloader": "unknown",
              "brand": "google",
              "device": "generic_x86_64",
              "display": "PSR1.180720.075",
              "fingerprint":
                  "google/sdk_gphone_x86_64/generic_x86_64:9/PSR1.180720.075/5124027:user/release-keys",
              "hardware": "ranchu",
              "host": "abfarm730",
              "id": "PSR1.180720.075",
              "manufacturer": "Google",
              "model": "Android SDK built for x86_64",
              "product": "sdk_gphone_x86_64",
              "supported32BitAbis": <String>[
                "x86",
              ],
              "supported64BitAbis": <String>[
                "x86_64",
              ],
              "supportedAbis": <String>[
                "x86_64",
                "x86",
              ],
              "tags": "release-keys",
              "type": "user",
              "isPhysicalDevice": false,
              "androidId": "f47571f3b4648f45",
              "systemFeatures": <String>[
                "android.hardware.sensor.proximity",
                "android.software.adoptable_storage",
                "android.hardware.sensor.accelerometer",
                "android.hardware.faketouch",
                "android.software.backup",
                "android.hardware.touchscreen",
              ],
            });
          case 'getIosDeviceInfo':
            return ({
              "name": "iPhone 13",
              "systemName": "iOS",
              "systemVersion": "13.0",
              "model": "iPhone",
              "localizedModel": "iPhone",
              "identifierForVendor": "88F59280-55AD-402C-B922-3203B4794C06",
              "isPhysicalDevice": false,
              "utsname": <String, dynamic>{
                "sysname": "Darwin",
                "nodename": "host",
                "release": "19.6.0",
                "version":
                    "Darwin Kernel Version 19.6.0: Thu Jun 18 20:49:00 PDT 2020; root:xnu-6153.141.1~1/RELEASE_X86_64",
                "machine": "x86_64",
              }
            });
          default:
            return null;
        }
      });
    });

    test("androidInfo", () async {
      final AndroidDeviceInfo result =
          await methodChannelDeviceInfo.androidInfo();

      expect(result.version.securityPatch, "2018-09-05");
      expect(result.version.sdkInt, 28);
      expect(result.version.release, "9");
      expect(result.version.previewSdkInt, 0);
      expect(result.version.incremental, "5124027");
      expect(result.version.codename, "REL");
      expect(result.board, "goldfish_x86_64");
      expect(result.bootloader, "unknown");
      expect(result.brand, "google");
      expect(result.device, "generic_x86_64");
      expect(result.display, "PSR1.180720.075");
      expect(result.fingerprint,
          "google/sdk_gphone_x86_64/generic_x86_64:9/PSR1.180720.075/5124027:user/release-keys");
      expect(result.hardware, "ranchu");
      expect(result.host, "abfarm730");
      expect(result.id, "PSR1.180720.075");
      expect(result.manufacturer, "Google");
      expect(result.model, "Android SDK built for x86_64");
      expect(result.product, "sdk_gphone_x86_64");
      expect(result.supported32BitAbis, <String>[
        "x86",
      ]);
      expect(result.supported64BitAbis, <String>[
        "x86_64",
      ]);
      expect(result.supportedAbis, <String>[
        "x86_64",
        "x86",
      ]);
      expect(result.tags, "release-keys");
      expect(result.type, "user");
      expect(result.isPhysicalDevice, false);
      expect(result.androidId, "f47571f3b4648f45");
      expect(result.systemFeatures, <String>[
        "android.hardware.sensor.proximity",
        "android.software.adoptable_storage",
        "android.hardware.sensor.accelerometer",
        "android.hardware.faketouch",
        "android.software.backup",
        "android.hardware.touchscreen",
      ]);
    });

    test("iosInfo", () async {
      final IosDeviceInfo result = await methodChannelDeviceInfo.iosInfo();
      expect(result.name, "iPhone 13");
      expect(result.systemName, "iOS");
      expect(result.systemVersion, "13.0");
      expect(result.model, "iPhone");
      expect(result.localizedModel, "iPhone");
      expect(
          result.identifierForVendor, "88F59280-55AD-402C-B922-3203B4794C06");
      expect(result.isPhysicalDevice, false);
      expect(result.utsname.sysname, "Darwin");
      expect(result.utsname.nodename, "host");
      expect(result.utsname.release, "19.6.0");
      expect(result.utsname.version,
          "Darwin Kernel Version 19.6.0: Thu Jun 18 20:49:00 PDT 2020; root:xnu-6153.141.1~1/RELEASE_X86_64");
      expect(result.utsname.machine, "x86_64");
    });
  });

  group(
      "$MethodChannelDeviceInfo handles null value in the map returned from method channel",
      () {
    late MethodChannelDeviceInfo methodChannelDeviceInfo;

    setUp(() async {
      methodChannelDeviceInfo = MethodChannelDeviceInfo();

      methodChannelDeviceInfo.channel
          .setMockMethodCallHandler((MethodCall methodCall) async {
        switch (methodCall.method) {
          case 'getAndroidDeviceInfo':
            return ({
              "version": null,
              "board": null,
              "bootloader": null,
              "brand": null,
              "device": null,
              "display": null,
              "fingerprint": null,
              "hardware": null,
              "host": null,
              "id": null,
              "manufacturer": null,
              "model": null,
              "product": null,
              "supported32BitAbis": null,
              "supported64BitAbis": null,
              "supportedAbis": null,
              "tags": null,
              "type": null,
              "isPhysicalDevice": null,
              "androidId": null,
              "systemFeatures": null,
            });
          case 'getIosDeviceInfo':
            return ({
              "name": null,
              "systemName": null,
              "systemVersion": null,
              "model": null,
              "localizedModel": null,
              "identifierForVendor": null,
              "isPhysicalDevice": null,
              "utsname": null,
            });
          default:
            return null;
        }
      });
    });

    test("androidInfo hanels null", () async {
      final AndroidDeviceInfo result =
          await methodChannelDeviceInfo.androidInfo();

      expect(result.version.securityPatch, null);
      expect(result.version.sdkInt, -1);
      expect(result.version.release, '');
      expect(result.version.previewSdkInt, null);
      expect(result.version.incremental, '');
      expect(result.version.codename, '');
      expect(result.board, '');
      expect(result.bootloader, '');
      expect(result.brand, '');
      expect(result.device, '');
      expect(result.display, '');
      expect(result.fingerprint, '');
      expect(result.hardware, '');
      expect(result.host, '');
      expect(result.id, '');
      expect(result.manufacturer, '');
      expect(result.model, '');
      expect(result.product, '');
      expect(result.supported32BitAbis, <String>[]);
      expect(result.supported64BitAbis, <String>[]);
      expect(result.supportedAbis, <String>[]);
      expect(result.tags, '');
      expect(result.type, '');
      expect(result.isPhysicalDevice, false);
      expect(result.androidId, '');
      expect(result.systemFeatures, <String>[]);
    });

    test("iosInfo handles null", () async {
      final IosDeviceInfo result = await methodChannelDeviceInfo.iosInfo();
      expect(result.name, '');
      expect(result.systemName, '');
      expect(result.systemVersion, '');
      expect(result.model, '');
      expect(result.localizedModel, '');
      expect(result.identifierForVendor, '');
      expect(result.isPhysicalDevice, false);
      expect(result.utsname.sysname, '');
      expect(result.utsname.nodename, '');
      expect(result.utsname.release, '');
      expect(result.utsname.version, '');
      expect(result.utsname.machine, '');
    });
  });

  group("$MethodChannelDeviceInfo handles method channel returns null", () {
    late MethodChannelDeviceInfo methodChannelDeviceInfo;

    setUp(() async {
      methodChannelDeviceInfo = MethodChannelDeviceInfo();

      methodChannelDeviceInfo.channel
          .setMockMethodCallHandler((MethodCall methodCall) async {
        switch (methodCall.method) {
          case 'getAndroidDeviceInfo':
            return null;
          case 'getIosDeviceInfo':
            return null;
          default:
            return null;
        }
      });
    });

    test("androidInfo handles null", () async {
      final AndroidDeviceInfo result =
          await methodChannelDeviceInfo.androidInfo();

      expect(result.version.securityPatch, null);
      expect(result.version.sdkInt, -1);
      expect(result.version.release, '');
      expect(result.version.previewSdkInt, null);
      expect(result.version.incremental, '');
      expect(result.version.codename, '');
      expect(result.board, '');
      expect(result.bootloader, '');
      expect(result.brand, '');
      expect(result.device, '');
      expect(result.display, '');
      expect(result.fingerprint, '');
      expect(result.hardware, '');
      expect(result.host, '');
      expect(result.id, '');
      expect(result.manufacturer, '');
      expect(result.model, '');
      expect(result.product, '');
      expect(result.supported32BitAbis, <String>[]);
      expect(result.supported64BitAbis, <String>[]);
      expect(result.supportedAbis, <String>[]);
      expect(result.tags, '');
      expect(result.type, '');
      expect(result.isPhysicalDevice, false);
      expect(result.androidId, '');
      expect(result.systemFeatures, <String>[]);
    });

    test("iosInfo handles null", () async {
      final IosDeviceInfo result = await methodChannelDeviceInfo.iosInfo();
      expect(result.name, '');
      expect(result.systemName, '');
      expect(result.systemVersion, '');
      expect(result.model, '');
      expect(result.localizedModel, '');
      expect(result.identifierForVendor, '');
      expect(result.isPhysicalDevice, false);
      expect(result.utsname.sysname, '');
      expect(result.utsname.nodename, '');
      expect(result.utsname.release, '');
      expect(result.utsname.version, '');
      expect(result.utsname.machine, '');
    });
  });

  group("$MethodChannelDeviceInfo android handles null values in list", () {
    late MethodChannelDeviceInfo methodChannelDeviceInfo;

    setUp(() async {
      methodChannelDeviceInfo = MethodChannelDeviceInfo();

      methodChannelDeviceInfo.channel
          .setMockMethodCallHandler((MethodCall methodCall) async {
        switch (methodCall.method) {
          case 'getAndroidDeviceInfo':
            return ({
              "supported32BitAbis": <String>["x86"],
              "supported64BitAbis": <String>["x86_64"],
              "supportedAbis": <String>["x86_64", "x86"],
              "systemFeatures": <String>[
                "android.hardware.sensor.proximity",
                "android.software.adoptable_storage",
                "android.hardware.sensor.accelerometer",
                "android.hardware.faketouch",
                "android.software.backup",
                "android.hardware.touchscreen",
              ],
            });
          default:
            return null;
        }
      });
    });

    test("androidInfo hanels null in list", () async {
      final AndroidDeviceInfo result =
          await methodChannelDeviceInfo.androidInfo();
      expect(result.supported32BitAbis, <String>['x86']);
      expect(result.supported64BitAbis, <String>['x86_64']);
      expect(result.supportedAbis, <String>['x86_64', 'x86']);
      expect(result.systemFeatures, <String>[
        "android.hardware.sensor.proximity",
        "android.software.adoptable_storage",
        "android.hardware.sensor.accelerometer",
        "android.hardware.faketouch",
        "android.software.backup",
        "android.hardware.touchscreen"
      ]);
    });
  });
}
