// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';

import 'package:pub/src/utils.dart';
import 'package:test/test.dart';

void main() {
  group('yamlToString()', () {
    test('null', () {
      expect(yamlToString(null), equals('null'));
    });

    test('numbers', () {
      expect(yamlToString(123), equals('123'));
      expect(yamlToString(12.34), equals('12.34'));
    });

    test('does not quote strings that do not need it', () {
      expect(yamlToString('a'), equals('a'));
      expect(yamlToString('some-string'), equals('some-string'));
      expect(yamlToString('hey123CAPS'), equals('hey123CAPS'));
      expect(yamlToString('_under_score'), equals('_under_score'));
    });

    test('quotes other strings', () {
      expect(yamlToString(''), equals('""'));
      expect(yamlToString('123'), equals('"123"'));
      expect(yamlToString('white space'), equals('"white space"'));
      expect(yamlToString('"quote"'), equals(r'"\"quote\""'));
      expect(yamlToString("apostrophe'"), equals('"apostrophe\'"'));
      expect(yamlToString('new\nline'), equals(r'"new\nline"'));
      expect(yamlToString('?unctu@t!on'), equals(r'"?unctu@t!on"'));
    });

    test('lists use JSON style', () {
      expect(yamlToString([1, 2, 3]), equals('[1,2,3]'));
    });

    test('uses indentation for maps', () {
      expect(
        yamlToString({
          'a': {'b': 1, 'c': 2},
          'd': 3,
        }),
        equals('''
a:
  b: 1
  c: 2
d: 3'''),
      );
    });

    test('sorts map keys', () {
      expect(
        yamlToString({'a': 1, 'c': 2, 'b': 3, 'd': 4}),
        equals('''
a: 1
b: 3
c: 2
d: 4'''),
      );
    });

    test('quotes map keys as needed', () {
      expect(
        yamlToString({'no': 1, 'yes!': 2, '123': 3}),
        equals('''
"123": 3
no: 1
"yes!": 2'''),
      );
    });

    test('handles non-string map keys', () {
      var map = <Object?, Object?>{};
      map[null] = 'null';
      map[123] = 'num';
      map[true] = 'bool';

      expect(
        yamlToString(map),
        equals('''
123: num
null: null
true: bool'''),
      );
    });

    test('handles empty maps', () {
      expect(yamlToString({}), equals('{}'));
      expect(
        yamlToString({'a': <Object, Object>{}, 'b': <Object, Object>{}}),
        equals('''
a: {}
b: {}'''),
      );
    });
  });

  group('niceDuration()', () {
    test('formats duration longer than a minute correctly', () {
      expect(
        niceDuration(Duration(minutes: 3, seconds: 1, milliseconds: 337)),
        equals('3:01.3s'),
      );
    });

    test('does not display extra zero when duration is less than a minute', () {
      expect(niceDuration(Duration(milliseconds: 400)), equals('0.4s'));
    });

    test('has reasonable output on minute boundary', () {
      expect(niceDuration(Duration(minutes: 1)), equals('1:00.0s'));
    });
  });

  group('uuid', () {
    var uuidRegexp = RegExp('^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-'
        r'[8-9A-B][0-9A-F]{3}-[0-9A-F]{12}$');

    test('min value is valid', () {
      var uuid = createUuid(List<int>.filled(16, 0));
      expect(uuid, matches(uuidRegexp));
      expect(uuid, '00000000-0000-4000-8000-000000000000');
    });
    test('max value is valid', () {
      var uuid = createUuid(List<int>.filled(16, 255));
      expect(uuid, matches(uuidRegexp));
      expect(uuid, 'FFFFFFFF-FFFF-4FFF-BFFF-FFFFFFFFFFFF');
    });
    test('random values are valid', () {
      for (var i = 0; i < 100; i++) {
        var uuid = createUuid();
        expect(uuid, matches(uuidRegexp));
      }
    });
  });

  group('minByAsync', () {
    test('is stable', () async {
      {
        final completers = <String, Completer<String>>{};
        Completer<String> completer(String k) =>
            completers.putIfAbsent(k, Completer.new);
        Future<int> lengthWhenComplete(String s) async {
          await completer(s).future;
          return s.length;
        }

        final w = expectLater(
          minByAsync(['aa', 'a', 'b', 'ccc'], lengthWhenComplete),
          completion('a'),
        );
        completer('aa').complete('');
        completer('b').complete('');
        completer('a').complete('');
        completer('ccc').complete('');
        await w;
      }
      {
        final completers = <String, Completer<String>>{};
        Completer<String> completer(String k) =>
            completers.putIfAbsent(k, Completer.new);
        Future<int> lengthWhenComplete(String s) async {
          await completer(s).future;
          return s.length;
        }

        final w = expectLater(
          minByAsync(['aa', 'a', 'b', 'ccc'], lengthWhenComplete),
          completion('a'),
        );
        completer('ccc').complete('');
        completer('a').complete('');
        completer('b').complete('');
        completer('aa').complete('');
        await w;
      }
    });
  });

  test('hexEncode', () {
    expect(hexEncode([]), '');
    expect(hexEncode([255, 0, 1, 240]), 'ff0001f0');
    expect(() => hexEncode([256, 0, 1]), throwsA(isA<FormatException>()));
  });
  test('hexDecode', () {
    expect(hexDecode(''), <int>[]);
    expect(hexDecode('ff0001f0abcdef'), [255, 0, 1, 240, 171, 205, 239]);
    expect(hexDecode('FF0001F0ABCDEF'), [255, 0, 1, 240, 171, 205, 239]);
    expect(() => hexDecode('F'), throwsA(isA<FormatException>()));
    expect(() => hexDecode('0p'), throwsA(isA<FormatException>()));
    expect(() => hexDecode('p0'), throwsA(isA<FormatException>()));
  });
}
