// Copyright (c) 2023, 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.

// This test captures the changes introduced in 2.29 of the patterns proposal.
import 'dart:collection';

import "package:expect/expect.dart";

main() {
  var map = {'a': 1, 'b': 2};

  // Map patterns don't access length.
  Expect.isTrue(switch (NoLengthMap(map)) { {'a': _} => true, _ => false });

  // Map patterns match even if there are extra keys.
  Expect.equals(
      'a b',
      switch (map) {
        {'a': _, 'b': _} => 'a b',
        {'a': _} => 'a',
        {'b': _} => 'b',
        _ => '???'
      });
}

class NoLengthMap extends MapBase<String, int> {
  final Map<String, int> _inner;

  NoLengthMap(this._inner);

  @override
  int get length => throw UnsupportedError('No length!');

  @override
  int? operator [](Object? key) => _inner[key];

  @override
  void operator []=(String key, int value) => _inner[key] = value;

  @override
  void clear() => _inner.clear();

  @override
  Iterable<String> get keys => _inner.keys;

  @override
  int? remove(Object? key) => _inner.remove(key);
}
