// 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_test/flutter_test.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';

class _TestTileProvider extends TileProvider {
  @override
  Future<Tile> getTile(int x, int y, int? zoom) async {
    return const Tile(0, 0, null);
  }
}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  group('tile overlay id tests', () {
    test('equality', () async {
      const TileOverlayId id1 = TileOverlayId('1');
      const TileOverlayId id2 = TileOverlayId('1');
      const TileOverlayId id3 = TileOverlayId('2');
      expect(id1, id2);
      expect(id1, isNot(id3));
    });

    test('toString', () async {
      const TileOverlayId id1 = TileOverlayId('1');
      expect(id1.toString(), 'TileOverlayId(1)');
    });
  });

  group('tile overlay tests', () {
    test('toJson returns correct format', () async {
      const TileOverlay tileOverlay = TileOverlay(
          tileOverlayId: TileOverlayId('id'),
          fadeIn: false,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      final Object json = tileOverlay.toJson();
      expect(json, <String, Object>{
        'tileOverlayId': 'id',
        'fadeIn': false,
        'transparency': moreOrLessEquals(0.1),
        'zIndex': 1,
        'visible': false,
        'tileSize': 128,
      });
    });

    test('invalid transparency throws', () async {
      expect(
          () => TileOverlay(
              tileOverlayId: const TileOverlayId('id1'), transparency: -0.1),
          throwsAssertionError);
      expect(
          () => TileOverlay(
              tileOverlayId: const TileOverlayId('id2'), transparency: 1.2),
          throwsAssertionError);
    });

    test('equality', () async {
      final TileProvider tileProvider = _TestTileProvider();
      final TileOverlay tileOverlay1 = TileOverlay(
          tileOverlayId: const TileOverlayId('id1'),
          fadeIn: false,
          tileProvider: tileProvider,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      final TileOverlay tileOverlaySameValues = TileOverlay(
          tileOverlayId: const TileOverlayId('id1'),
          fadeIn: false,
          tileProvider: tileProvider,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      final TileOverlay tileOverlayDifferentId = TileOverlay(
          tileOverlayId: const TileOverlayId('id2'),
          fadeIn: false,
          tileProvider: tileProvider,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      const TileOverlay tileOverlayDifferentProvider = TileOverlay(
          tileOverlayId: TileOverlayId('id1'),
          fadeIn: false,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      expect(tileOverlay1, tileOverlaySameValues);
      expect(tileOverlay1, isNot(tileOverlayDifferentId));
      expect(tileOverlay1, isNot(tileOverlayDifferentProvider));
    });

    test('clone', () async {
      final TileProvider tileProvider = _TestTileProvider();
      // Set non-default values for every parameter.
      final TileOverlay tileOverlay = TileOverlay(
          tileOverlayId: const TileOverlayId('id1'),
          fadeIn: false,
          tileProvider: tileProvider,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      expect(tileOverlay, tileOverlay.clone());
    });

    test('hashCode', () async {
      final TileProvider tileProvider = _TestTileProvider();
      const TileOverlayId id = TileOverlayId('id1');
      final TileOverlay tileOverlay = TileOverlay(
          tileOverlayId: id,
          fadeIn: false,
          tileProvider: tileProvider,
          transparency: 0.1,
          zIndex: 1,
          visible: false,
          tileSize: 128);
      expect(
          tileOverlay.hashCode,
          Object.hash(
              tileOverlay.tileOverlayId,
              tileOverlay.fadeIn,
              tileOverlay.tileProvider,
              tileOverlay.transparency,
              tileOverlay.zIndex,
              tileOverlay.visible,
              tileOverlay.tileSize));
    });
  });
}
