// Copyright (c) 2015, 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 'package:collection/collection.dart';
import 'package:test/test.dart';

void main() {
  var strings = [
    '',
    '\x00',
    ' ',
    '+',
    '/',
    '0',
    '00',
    '000',
    '001',
    '01',
    '011',
    '1',
    '100',
    '11',
    '110',
    '9',
    ':',
    '=',
    '@',
    'A',
    'A0',
    'A000A',
    'A001A',
    'A00A',
    'A01A',
    'A0A',
    'A1A',
    'AA',
    'AAB',
    'AB',
    'Z',
    '[',
    '_',
    '`',
    'a',
    'a0',
    'a000a',
    'a001a',
    'a00a',
    'a01a',
    'a0a',
    'a1a',
    'aa',
    'aab',
    'ab',
    'z',
    '{',
    '~'
  ];

  List<String> sortedBy(int Function(String, String) compare) =>
      strings.toList()
        ..shuffle()
        ..sort(compare);

  test('String.compareTo', () {
    expect(sortedBy(null), strings);
  });
  test('compareAsciiLowerCase', () {
    expect(sortedBy(compareAsciiLowerCase), sortedBy((a, b) {
      var delta = a.toLowerCase().compareTo(b.toLowerCase());
      if (delta != 0) return delta;
      if (a == b) return 0;
      return a.compareTo(b);
    }));
  });
  test('compareAsciiUpperCase', () {
    expect(sortedBy(compareAsciiUpperCase), sortedBy((a, b) {
      var delta = a.toUpperCase().compareTo(b.toUpperCase());
      if (delta != 0) return delta;
      if (a == b) return 0;
      return a.compareTo(b);
    }));
  });

  // Replace any digit sequence by ("0", value, length) as char codes.
  // This will sort alphabetically (by charcode) the way digits sort
  // numerically, and the leading 0 means it sorts like a digit
  // compared to non-digits.
  String replaceNumbers(String string) =>
      string.replaceAllMapped(RegExp(r'\d+'), (m) {
        var digits = m[0];
        return String.fromCharCodes([0x30, int.parse(digits), digits.length]);
      });

  test('compareNatural', () {
    expect(sortedBy(compareNatural),
        sortedBy((a, b) => replaceNumbers(a).compareTo(replaceNumbers(b))));
  });

  test('compareAsciiLowerCaseNatural', () {
    expect(sortedBy(compareAsciiLowerCaseNatural), sortedBy((a, b) {
      var delta = replaceNumbers(a.toLowerCase())
          .compareTo(replaceNumbers(b.toLowerCase()));
      if (delta != 0) return delta;
      if (a == b) return 0;
      return a.compareTo(b);
    }));
  });

  test('compareAsciiUpperCaseNatural', () {
    expect(sortedBy(compareAsciiUpperCaseNatural), sortedBy((a, b) {
      var delta = replaceNumbers(a.toUpperCase())
          .compareTo(replaceNumbers(b.toUpperCase()));
      if (delta != 0) return delta;
      if (a == b) return 0;
      return a.compareTo(b);
    }));
  });
}
