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

// @dart = 2.7

import "package:expect/expect.dart";

// Test that optimized 'null + x' and slow path '+' produce the same error.
//
// They don't, sometimes we generate null.$add, sometimes JSNull_methods.$add.

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
confuse(x) => x;

void check2(String name, name1, f1, name2, f2) {
  Error trap(part, f) {
    try {
      f();
    } catch (e) {
      return e;
    }
    Expect.fail('should throw: $name.$part');
  }

  var e1 = trap(name1, f1);
  var e2 = trap(name2, f2);
  var s1 = '$e1';
  var s2 = '$e2';
  Expect.equals(s1, s2, '\n  $name.$name1: "$s1"\n  $name.$name2: "$s2"\n');
}

void check(String name, f1, f2, [f3, f4, f5, f6]) {
  check2(name, 'f1', f1, 'f2', f2);
  if (f3 != null) check2(name, 'f1', f1, 'f3', f3);
  if (f4 != null) check2(name, 'f1', f1, 'f4', f4);
  if (f5 != null) check2(name, 'f1', f1, 'f5', f5);
  if (f6 != null) check2(name, 'f1', f1, 'f6', f6);
}

class NullPlusInt {
  static f1() {
    return confuse(null) + confuse(1);
  }

  static f2() {
    return confuse(null) + 1;
  }

  static f3() {
    return (confuse(null) as int) + confuse(1);
  }

  static f4() {
    return (confuse(null) as int) + 1;
  }

  static f5() {
    var a = null;
    return a + confuse(1);
  }

  static f6() {
    var a = null;
    return a + 1;
  }

  static test() {
    // Sometimes we generate null.$add, sometimes JSNull_methods.$add. The best
    // we can do is check there is an error.
    check('NullPlusInt', f1, f1);
    check('NullPlusInt', f2, f2);
    check('NullPlusInt', f3, f3);
    check('NullPlusInt', f4, f4);
    check('NullPlusInt', f5, f5);
    check('NullPlusInt', f6, f6);
  }
}

main() {
  NullPlusInt.test();
}
