// Copyright 2020 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.

// @dart = 2.9

import 'package:flutter_test/flutter_test.dart';
import 'package:file_selector_web/src/utils.dart';
import 'package:file_selector_platform_interface/file_selector_platform_interface.dart';

void main() {
  group('FileSelectorWeb utils', () {
    group('acceptedTypesToString', () {
      test('works', () {
        final List<XTypeGroup> acceptedTypes = [
          XTypeGroup(label: 'images', webWildCards: ['images/*']),
          XTypeGroup(label: 'jpgs', extensions: ['jpg', 'jpeg']),
          XTypeGroup(label: 'pngs', mimeTypes: ['image/png']),
        ];
        final accepts = acceptedTypesToString(acceptedTypes);
        expect(accepts, 'images/*,.jpg,.jpeg,image/png');
      });

      test('works with an empty list', () {
        final List<XTypeGroup> acceptedTypes = [];
        final accepts = acceptedTypesToString(acceptedTypes);
        expect(accepts, '');
      });

      test('works with extensions', () {
        final List<XTypeGroup> acceptedTypes = [
          XTypeGroup(label: 'jpgs', extensions: ['jpeg', 'jpg']),
          XTypeGroup(label: 'pngs', extensions: ['png']),
        ];
        final accepts = acceptedTypesToString(acceptedTypes);
        expect(accepts, '.jpeg,.jpg,.png');
      });

      test('works with mime types', () {
        final List<XTypeGroup> acceptedTypes = [
          XTypeGroup(label: 'jpgs', mimeTypes: ['image/jpeg', 'image/jpg']),
          XTypeGroup(label: 'pngs', mimeTypes: ['image/png']),
        ];
        final accepts = acceptedTypesToString(acceptedTypes);
        expect(accepts, 'image/jpeg,image/jpg,image/png');
      });

      test('works with web wild cards', () {
        final List<XTypeGroup> acceptedTypes = [
          XTypeGroup(label: 'images', webWildCards: ['image/*']),
          XTypeGroup(label: 'audios', webWildCards: ['audio/*']),
          XTypeGroup(label: 'videos', webWildCards: ['video/*']),
        ];
        final accepts = acceptedTypesToString(acceptedTypes);
        expect(accepts, 'image/*,audio/*,video/*');
      });
    });
  });
}
