// 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:ios_platform_images/ios_platform_images.dart';
import 'package:ios_platform_images/src/messages.g.dart';

void main() {
  late FakePlatformImagesApi fakeApi;

  setUp(() {
    fakeApi = FakePlatformImagesApi();
    setPlatformImageHostApi(fakeApi);
  });

  test('resolveURL passes arguments', () async {
    const String name = 'a name';
    const String extension = '.extension';

    await IosPlatformImages.resolveURL(name, extension: extension);

    expect(fakeApi.passedName, name);
    expect(fakeApi.passedExtension, extension);
  });

  test('resolveURL returns null', () async {
    expect(await IosPlatformImages.resolveURL('foobar'), null);
  });

  test('resolveURL returns result', () async {
    const String result = 'a result';
    fakeApi.resolutionResult = result;

    expect(await IosPlatformImages.resolveURL('foobar'), result);
  });

  test('loadImage passes argument', () async {
    fakeApi.loadResult = PlatformImageData(data: Uint8List(1), scale: 1.0);
    const String name = 'a name';

    IosPlatformImages.load(name);

    expect(fakeApi.passedName, name);
  });
}

class FakePlatformImagesApi implements PlatformImagesApi {
  String? passedName;
  String? passedExtension;
  String? resolutionResult;
  PlatformImageData? loadResult;

  @override
  Future<PlatformImageData?> loadImage(String name) async {
    passedName = name;
    return loadResult;
  }

  @override
  Future<String?> resolveUrl(String name, String? extension) async {
    passedName = name;
    passedExtension = extension;
    return resolutionResult;
  }
}
