// Copyright (c) 2019, 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:test/test.dart';
import 'package:protobuf/src/protobuf/permissive_compare.dart';

void main() {
  void symmetric(String a, String b, bool expected) {
    expect(permissiveCompare(a, b), expected);
    expect(permissiveCompare(b, a), expected);
  }

  List<String> variationsFromSeed(String seed) {
    final result = [
      seed,
      seed.toUpperCase(),
      '-$seed',
      '-${seed.toUpperCase()}',
      '_$seed',
      '_${seed.toUpperCase()}',
      '$seed-',
      '${seed}_',
    ];
    if (2 <= seed.length) {
      result.add('${seed.substring(0, 1)}_${seed.substring(1)}');
      result.add('${seed.substring(0, 1)}-${seed.substring(1)}');
      result.add('${seed.substring(0, 1).toUpperCase()}${seed.substring(1)}');
      result.add('${seed.substring(0, 1)}${seed.substring(1).toUpperCase()}');
    }
    return result;
  }

  test('permissive compare', () {
    final seeds = ['', 'a', 'b', 'aa', 'ab', 'bb', 'aaaa'];
    for (final a in seeds) {
      for (final aVariant in variationsFromSeed(a)) {
        for (final b in seeds) {
          for (final bVariant in variationsFromSeed(b)) {
            symmetric(aVariant, bVariant, a == b);
          }
        }
      }
    }
  });
}
