// 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";
import "dart:typed_data";

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

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

class TooHigh {
  static load1() {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    try {
      return confuse(a)[3]; // dynamic receiver for indexer.
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2() {
    try {
      confuse(load2x)(3);
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2x(i) {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    return a[i]; // 'a' is String of unknown length.
  }

  static test() {
    var e1 = load1();
    var e2 = load2();
    print("  A: '$e1'\n  B: '$e2'");
    Expect.equals('$e1', '$e2');
  }
}

class Negative {
  static load1() {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    try {
      return confuse(a)[-3]; // dynamic receiver for indexer.
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2() {
    try {
      confuse(load2x)(-3);
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2x(i) {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    return a[i]; // 'a' is String of unknown length.
  }

  static test() {
    var e1 = load1();
    var e2 = load2();
    print("  A: '$e1'\n  B: '$e2'");
    Expect.equals('$e1', '$e2');
  }
}

class Empty {
  static load1() {
    var a = confuse(true) ? '' : 'ABCDE';
    try {
      return confuse(a)[-3]; // dynamic receiver for indexer.
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2() {
    try {
      confuse(load2x)(-3);
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2x(i) {
    var a = confuse(true) ? '' : 'ABCDE';
    return a[i]; // 'a' is String of unknown length.
  }

  static test() {
    var e1 = load1();
    var e2 = load2();
    print("  A: '$e1'\n  B: '$e2'");
    Expect.equals('$e1', '$e2');
  }
}

class BadType {
  static load1() {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    try {
      return confuse(a)['a']; // dynamic receiver for indexer.
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2() {
    try {
      confuse(load2x)('a');
    } catch (e) {
      return e;
    }
    Expect.fail('unreached');
  }

  static load2x(i) {
    var a = confuse(true) ? 'AB' : 'ABCDE';
    return a[i]; // 'a' is String of unknown length.
  }

  static test() {
    var e1 = load1();
    var e2 = load2();
    print("  A: '$e1'\n  B: '$e2'");
    Expect.equals('$e1', '$e2');
  }
}

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