// 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";

// Short string.
var s = "0123456789";
// Long string.
var l = "$s$s$s$s$s$s$s$s$s$s";
// Very long string.
var v = "$l$l$l$l$l$l$l$l$l$l";


testSliceSuccess() {
  // Test different ways to get the same slice from a string.
  testSlice(String string, int start, int end) {
    int length = string.length;
    String expect = string.substring(start, end);
    Expect.equals(expect, string.slice(start, end), "#${length}[$start:$end]");
    if (start < length) {
      // If start == length, there is no negative representation of the position.
      Expect.equals(expect, string.slice(start - length, end),
                    "#${length}[${start - length}:$end]");
    }
    if (end < length) {
      Expect.equals(expect, string.slice(start, end - length),
                    "#${length}[$start:${end - length}]");
      Expect.equals(expect, string.slice(start - length, end - length),
                    "#${length}[${start-length}:${end-length}]");
    } else {
      Expect.equals(expect, string.slice(start),
                    "#${length}[$start]");
      if (start < length) {
        Expect.equals(expect, string.slice(start - length),
                      "#${length}[${start-length}]");
        if (start == 0) {
          Expect.equals(string, string.slice(), "#$length[:]");
        }
      }
    }
  }

  testSliceCombinations(String string) {
    int length = string.length;
    List<int> positions = [0, 1, string.length >> 1, length - 1, length];
    for (int i = 0; i < positions.length; i++) {
      for (int j = i; j < positions.length; j++) {
        testSlice(string, positions[i], positions[j]);
      }
    }
  }

  testSliceCombinations(s);
  testSliceCombinations(l);
  testSliceCombinations(v);
}

testSliceError() {
  function expectRangeError(void thunk()) {
    Expect.throws(thunk, (e) => e is RangeError);
  };
  function expectArgumentError(void thunk()) {
    Expect.throws(thunk, (e) => e is ArgumentError);
  };
  function badType(void thunk()) {
    bool checkedMode = false;
    assert(checkedMode = true);
    Expect.throws(thunk,
                  (e) => checkedMode ? e is TypeError : e is ArgumentError);
  }

  // Invalid start:
  expectRangeError(() => s.slice(11));
  expectRangeError(() => s.slice(-11));
  // Invalid end:
  expectRangeError(() => s.slice(0, 11));
  expectRangeError(() => s.slice(0, -11));
  // Non-int:
  badType(() => s.slice(1.5));
  badType(() => s.slice(0, 1.5));
  badType(() => s.slice("1"));
  badType(() => s.slice(0, "1"));
  // Bad order:
  expectArgumentError(() => s.slice(5, 4));
  expectArgumentError(() => s.slice(-5, 4));
  expectArgumentError(() => s.slice(5, -6));
  expectArgumentError(() => s.slice(-5, -6));
}


main() {
  testSliceSuccess();
  testSliceError();
}
