// Copyright (c) 2012, 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 optimized [] on strings.

var a = "abc";
var b = "øbc";
var c = new String.fromCharCodes([123, 456, 789]);

test_charat(s, i) {
  return s[i];
}

test_const_str(i) {
  return "abc"[i];
}


test_const_index(s) {
  return s[0];
}

test_const_index2(s) {
  return s[3];
}

main() {
  Expect.equals("a", test_charat(a, 0));
  for (var i=0; i<10000; i++) test_charat(a, 0);
  Expect.equals("a", test_charat(a, 0));
  Expect.equals("b", test_charat(a, 1));
  Expect.equals("c", test_charat(a, 2));
  Expect.throws(() => test_charat(a, 3));

  Expect.equals("a", test_const_str(0));
  for (var i=0; i<10000; i++) test_const_str(0);
  Expect.equals("a", test_const_str(0));
  Expect.equals("b", test_const_str(1));
  Expect.equals("c", test_const_str(2));
  Expect.throws(() => test_const_str(3));

  Expect.equals("a", test_const_index(a));
  for (var i=0; i<10000; i++) test_const_index(a);
  Expect.equals("a", test_const_index(a));
  Expect.equals("ø", test_const_index(b));
  Expect.equals(new String.fromCharCodes([123]), test_const_index(c));
  Expect.throws(() => test_const_index2(a));

  Expect.equals("ø", test_charat(b, 0));
  for (var i=0; i<10000; i++) test_charat(b, 0);
  Expect.equals("ø", test_charat(b, 0));
  Expect.equals("b", test_charat(b, 1));
  Expect.equals("c", test_charat(b, 2));
  Expect.throws(() => test_charat(b, 3));

  Expect.equals(new String.fromCharCodes([123]), test_charat(c, 0));
  for (var i=0; i<10000; i++) test_charat(c, 0);
  Expect.equals(new String.fromCharCodes([123]), test_charat(c, 0));
  Expect.equals(new String.fromCharCodes([456]), test_charat(c, 1));
  Expect.equals(new String.fromCharCodes([789]), test_charat(c, 2));
  Expect.throws(() => test_charat(c, 3));


}
