// 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');
  }

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

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