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

import '../test_shared.dart';

const _testMap = {
  'a': 1,
  'b': 2,
};

void main() {
  test('length', () {
    check(_testMap).length.equals(2);
  });
  test('entries', () {
    check(_testMap).entries.any(
          (it) => it
            ..has((p0) => p0.key, 'key').equals('a')
            ..has((p0) => p0.value, 'value').equals(1),
        );
  });
  test('keys', () {
    check(_testMap).keys.contains('a');
  });
  test('values', () {
    check(_testMap).values.contains(1);
  });

  group('operator []', () {
    test('succeeds for a key that exists', () {
      check(_testMap)['a'].equals(1);
    });
    test('fails for a missing key', () {
      check(_testMap).isRejectedBy((it) => it['z'],
          which: ["does not contain the key 'z'"]);
    });
    test('can be described', () {
      check((Subject<Map<String, Object>> it) => it['some\nlong\nkey'])
          .description
          .deepEquals([
        "  contains a value for 'some",
        '  long',
        "  key'",
      ]);
      check((Subject<Map<String, Object>> it) =>
          it['some\nlong\nkey'].equals(1)).description.deepEquals([
        "  contains a value for 'some",
        '  long',
        "  key' that:",
        '    equals <1>',
      ]);
    });
  });
  test('isEmpty', () {
    check(<String, int>{}).isEmpty();
    check(_testMap).isRejectedBy((it) => it.isEmpty(), which: ['is not empty']);
  });
  test('isNotEmpty', () {
    check(_testMap).isNotEmpty();
    check(<Object, Object>{})
        .isRejectedBy((it) => it.isNotEmpty(), which: ['is not empty']);
  });
  group('containsKey', () {
    test('succeeds for a key that exists', () {
      check(_testMap).containsKey('a');
    });
    test('fails for a missing key', () {
      check(_testMap).isRejectedBy(
        (it) => it.containsKey('c'),
        which: ["does not contain key 'c'"],
      );
    });
    test('can be described', () {
      check((Subject<Map<String, Object>> it) =>
          it.containsKey('some\nlong\nkey')).description.deepEquals([
        "  contains key 'some",
        '  long',
        "  key'",
      ]);
    });
  });
  test('containsKeyThat', () {
    check(_testMap).containsKeyThat((it) => it.equals('a'));
    check(_testMap).isRejectedBy(
      (it) => it.containsKeyThat((it) => it.equals('c')),
      which: ['Contains no matching key'],
    );
  });
  group('containsValue', () {
    test('succeeds for happy case', () {
      check(_testMap).containsValue(1);
    });
    test('fails for missing value', () {
      check(_testMap).isRejectedBy(
        (it) => it.containsValue(3),
        which: ['does not contain value <3>'],
      );
    });
    test('can be described', () {
      check((Subject<Map<String, String>> it) =>
          it.containsValue('some\nlong\nkey')).description.deepEquals([
        "  contains value 'some",
        '  long',
        "  key'",
      ]);
    });
  });
  test('containsValueThat', () {
    check(_testMap).containsValueThat((it) => it.equals(1));
    check(_testMap).isRejectedBy(
      (it) => it.containsValueThat((it) => it.equals(3)),
      which: ['Contains no matching value'],
    );
  });
}
