// Copyright (c) 2018, 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 prefer_int_literals`

import 'dart:math';

const double okDouble = 7.3; // OK
const double shouldBeInt1 = 8.0; // LINT
const double shouldBeInt2 = -8.0; // LINT
const double shouldBeInt3 = 88.00; // LINT

// TODO(danrubel): Consider linting these as well
const double shouldBeInt4 = 8.0 + 7.0; // OK

const inferredAsDouble = 8.0; // OK
Object inferredAsDouble2 = 8.0; // OK
dynamic inferredAsDouble3 = 8.0; // OK
final inferredAsDouble4 = 8.0 + 7.0; // OK

class A {
  var w = 7.0e2; // OK
  double x = 7.0e2; // LINT
  double y = 7.1e2; // LINT
  double z = 7.576e2; // OK
  A(this.x);
  namedDouble(String s, {double d}) {}
  namedDynamic(String s, {d}) {}
}

class B extends A {
  B.one() : super(1.0); // LINT
  B.two() : super(2.3); // OK
  B.three() : super(3);

  namedParam1() {
    namedDouble('should be int', d: 1.0); // LINT
  }

  namedParam2() {
    namedDynamic('should stay double', d: 1.0); // OK
  }

  double typedMethodReturn1() => 6.0; // LINT
  double typedMethodReturn2() {
    typedMethodReturn1();
    return 6.0; // LINT
  }

  untypedMethodReturn1() => 6.0; // OK
  untypedMethodReturn2() {
    untypedMethodReturn1();
    return 6.0; // OK
  }
}

void takesDouble(double value) {}

void typedVar() {
  takesDouble(3.0); // LINT
  takesDouble(-3.0); // LINT
  takesDouble(33.00); // LINT

  double myDouble1 = 5.0; // LINT

  myDouble1 = myDouble1 + 3.7; // OK
  myDouble1 = 5.7 * myDouble1 / myDouble1; // OK

  // TODO(danrubel): Consider if these can be converted to an int literal
  myDouble1 = 4.0 + myDouble1; // OK
  myDouble1 = myDouble1 + 4.0; // OK
  myDouble1 = myDouble1 - 4.0; // OK
  myDouble1 = myDouble1 * 4.0; // OK
  myDouble1 = myDouble1 / 4.0; // OK
}

void untypedVar() {
  var inferredAsInt = 3;

  var inferredAsDouble1 = inferredAsInt + 3.0; // OK
  var inferredAsDouble2 = inferredAsDouble1 + 3.7; // OK
  inferredAsDouble1 = inferredAsInt + 3.0; // OK
  inferredAsDouble2 = inferredAsDouble1 + 3.7; // OK

  // No static type info is not available for these
  var inferredAsDouble3 = inferredAsDouble2 + 3.0; // OK
  var inferredAsDouble4 = inferredAsDouble3 - 3.0; // OK
  inferredAsDouble3 = inferredAsDouble2 + 3.0; // OK
  inferredAsDouble4 = inferredAsDouble3 - 3.0; // OK

  int largeInt = 1 << 61 + 1;
  double largeDouble1 = largeInt * 360.0; // OK
  var largeDouble2 = largeInt * 360.0; // OK

  largeDouble1 = largeDouble1 + largeDouble2 + inferredAsDouble4;
}

double typedFunctReturn1() => 6.0; // LINT
double typedFunctReturn2(List<bool> b) {
  if (b[0]) return 6.0; // LINT
  if (b[1]) {
    return 6.0; // LINT
  }
  typedFunctReturn1();
  return 6.0; // LINT
}

untypedFunctReturn1() => 6.0; // OK
untypedFunctReturn2(List<bool> b) {
  if (b[0]) return 6.0; // OK
  if (b[1]) {
    return 6.0; // OK
  }

  double typedInnerReturn1() => 6.0; // LINT
  double typedInnerReturn2() {
    typedInnerReturn1();
    return 6.0; // LINT
  }

  typedInnerReturn2();

  untypedInnerReturn1() => 6.0; // OK
  untypedInnerReturn2() {
    untypedInnerReturn1();
    return 6.0; // OK
  }

  untypedInnerReturn2();

  untypedFunctReturn1();
  return 6.0; // OK
}

double typedExpressionReturn() {
  double myDouble = 6;

  // TODO(danrubel): Consider if this can be converted to an int literal
  return 6.0 + myDouble; // OK
}

linter_issue_1227() {
  int i = 1 << 61 + 1;
  var value1 = 360.0 * i; // OK
  return value1;
}

linter_issue_1231() {
  double myDouble = 3;
  max(3.0, 4); // OK
  max(myDouble, 5.0); // LINT
  var value1 = max(myDouble, 6.0); // LINT
  double value2 = max(myDouble, 7.0); // LINT
  return value1 + value2;
}

class LinterIssue1230 {
  static const List<double> list1 = <double>[50.0]; // LINT
  static const list2 = <double>[50.0]; // LINT
  static const list3 = [50.0]; // OK
}
