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

// test w/ `dart test -N avoid_positional_boolean_parameters`

class Library {
  void checkRegularBook(String name) {
    _checkBook(name, false);
  }

  void checkPremiumBook(String name) {
    _checkBook(name, true);
  }

  void _checkBook(String name, bool isPremium) {} // OK because it is private.
}

void good({bool a}) { // OK
  _good(a);
}

void bad(bool a) {} // LINT

void _good(bool a) {} // OK because it is private.

class A {
  void good({bool a}) {} // OK

  void bad(bool a) {} // LINT
}

class B {
  static void good({bool a}) {} // OK

  static void bad(bool a) {} // LINT
}

class C {
  bool value;
  C.good({bool value}) { // OK
    this.value = value;
  }

  C.bad(bool a) { // LINT
    this.value = value;
  }

  void operator []=(int index, bool value) { // OK (#803)
  }

  void operator +(bool value) { // OK (#803)
  }

  void operator -(bool value) { // OK (#803)
  }
}

class D {
  bool value;
  D.good({this.value}); // OK

  D.bad(this.value); // LINT
}

class E {
  void bad([bool value]) {} // LINT

  void good({bool value: true}) {} // OK
}

class F {
  set good(bool value) {} // OK
}

class G {
  G._internal([bool value]); // OK because is private
}

class H extends E {
  @override
  void bad([bool value]) {} // OK because it has inherited method.
}

abstract class I implements E {
  @override
  void bad([bool value]) {} // OK because it has inherited method.
}

void closureAsArgument() {
  final array = <bool>[true, false, true, false];
  array.where((bool e) => e); // OK because is an anonymous function.
}

extension Ext on E {
  void badBad([bool value]) {} // LINT
}

extension on E {
  void badBadBad([bool value]) {} // LINT
}
