// 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:expect/expect.dart';
import 'static_extension_constant_lib.dart' hide b, i, d, s;
import 'static_extension_constant_lib.dart' as lib show b, i, d, s;

// Ensure that all expressions in runtimeExtensionCalls invoke
// an extension method rather than an instance method, such that
// static_extension_constant_error_test gets an error for them all.

const dynamic b = lib.b;
const dynamic i = lib.i;
const dynamic d = lib.d;
const dynamic s = lib.s;

// These expressions should be identical to those in
// `lib.runtimeExtensionCalls`.
var dynamicInstanceCalls = <Object>[
  ~i,
  b & b,
  b | b,
  b ^ b,
  i ~/ i,
  i >> i,
  i >>> i,
  i << i,
  i + i,
  -i,
  d - d,
  d * d,
  d / d,
  d % d,
  d < i,
  i <= d,
  d > i,
  i >= i,
  s.length,
];

void main() {
  for (int i = 0; i < dynamicInstanceCalls.length; ++i) {
    Expect.notEquals(dynamicInstanceCalls[i], runtimeExtensionCalls[i]);
  }
}
