// 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.

import "package:expect/expect.dart";

// Test that optimized codeUnitAt and slow path codeUnitAt produce the same
// error.

@NoInline()
@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]) {
  check2(name, 'f1', f1, 'f2', f2);
  if (f3 != null) check2(name, 'f1', f1, 'f3', f3);
  if (f4 != null) check2(name, 'f1', f1, 'f4', f4);
}

class TooHigh {
  static f1() {
    return confuse('AB').codeUnitAt(3); // dynamic receiver.
  }

  static f2() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    var i = confuse(3);
    return a.codeUnitAt(i);
  }

  static f3() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    return a.codeUnitAt(3);
  }

  static test() {
    check('TooHigh', f1, f2, f3);
  }
}

class Negative {
  static f1() {
    return confuse('AB').codeUnitAt(-3); // dynamic receiver.
  }

  static f2() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    var i = confuse(-3);
    return a.codeUnitAt(i);
  }

  static f3() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    var i = confuse(true) ? -3 : 0;
    return a.codeUnitAt(i);
  }

  static f4() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    return a.codeUnitAt(-3);
  }

  static test() {
    check('Negative', f1, f2, f3, f4);
  }
}

class Empty {
  static f1() {
    return confuse('').codeUnitAt(0); // dynamic receiver.
  }

  static f2() {
    var a = confuse(true) ? '' : 'ABCDE'; // Empty String with unknown length.
    var i = confuse(true) ? 0 : 1;
    return a.codeUnitAt(i);
  }

  static f3() {
    var a = confuse(true) ? '' : 'ABCDE'; // Empty String with unknown length.
    return a.codeUnitAt(0);
  }

  static test() {
    check('Empty', f1, f2, f3);
  }
}

class BadType {
  static f1() {
    return confuse('AB').codeUnitAt('a'); // dynamic receiver.
  }

  static f2() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    var i = confuse('a');
    return a.codeUnitAt(i);
  }

  static f3() {
    var a = confuse(true) ? 'AB' : 'ABCDE'; // String with unknown length.
    return a.codeUnitAt(('a' as dynamic));
  }

  static test() {
    check('BadType', f1, f2, f3);
  }
}

main() {
  TooHigh.test();
  Negative.test();
  Empty.test();
  BadType.test();
}
