// Copyright (c) 2013, 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.

// Test the IterableBase/IterableMixin toString method.

import "package:expect/expect.dart";
import "dart:collection";

String mkIt(int len, [func]) {
  var list;
  if (func == null) {
    list = new List.generate(len, (x) => x);
  } else {
    list = new List.generate(len, func);
  }
  return new MyIterable(list).toString();
}

class MyIterable extends IterableBase {
  final Iterable _base;
  MyIterable(this._base);
  Iterator get iterator => _base.iterator;
}

void main() {
  Expect.equals("()", mkIt(0));
  Expect.equals("(0)", mkIt(1));
  Expect.equals("(0, 1)", mkIt(2));
  Expect.equals("(0, 1, 2, 3, 4, 5, 6, 7, 8)", mkIt(9));

  // Builds string up to 60 characters, then finishes with last two
  // elements.
  Expect.equals(
    //0123456789012345678901234567890123456789 - 40 characters
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, 14, 15, 16, 17, 18, ..., 98, 99)",
    mkIt(100),
  );

  Expect.equals(
    //0123456789012345678901234567890123456789
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, 14, 15, 16, 17, 18)",
    mkIt(19),
  );

  Expect.equals(
    //0123456789012345678901234567890123456789
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, 14, 15, 16, 17, 18, 19)",
    mkIt(20),
  );

  Expect.equals(
    //0123456789012345678901234567890123456789
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, 14, 15, 16, 17, 18, 19, 20)",
    mkIt(21),
  );

  // Don't show last two elements if more than 100 elements total
  // (can't be 100 elements in 80 characters including commas).
  Expect.equals(
    //0123456789012345678901234567890123456789
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, 14, 15, 16, 17, 18, 19, 20, ...)",
    mkIt(101),
  );

  // If last two elements bring total over 80 characters, drop some of
  // the previous ones as well.

  Expect.equals(
    //0123456789012345678901234567890123456789
    "(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1"
    "2, 13, ..., 18, xxxxxxxxxxxxxxxxxxxx)",
    mkIt(20, (x) => x == 19 ? "xxxxxxxxxxxxxxxxxxxx" : "$x"),
  );

  // Never drop the first three or the last two.
  Expect.equals(
    //0123456789012345678901234567890123456789
    "(xxxxxxxxxxxxxxxxx, xxxxxxxxxxxxxxxxx, x"
    "xxxxxxxxxxxxxxxx, ..., 18, xxxxxxxxxxxxx"
    "xxxx)",
    mkIt(20, (x) => (x < 3 || x == 19) ? "xxxxxxxxxxxxxxxxx" : "$x"),
  );

  // Never drop the first three or the last two.
  Expect.equals(
    //0123456789012345678901234567890123456789
    "(xxxxxxxxxxxxxxxxx, xxxxxxxxxxxxxxxxx, x"
    "xxxxxxxxxxxxxxxx, ..., xxxxxxxxxxxxxxxxx"
    ", 19)",
    mkIt(20, (x) => (x < 3 || x == 18) ? "xxxxxxxxxxxxxxxxx" : "$x"),
  );

  // If the first three are very long, always include them anyway.
  Expect.equals(
    //0123456789012345678901234567890123456789
    "(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,"
    " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,"
    " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,"
    " ..., 98, 99)",
    mkIt(100, (x) => (x < 3) ? "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" : "$x"),
  );

  Expect.equals(
    //0123456789012345678901234567890123456789
    "(, , , , , , , , , , , , , , , , , , , ,"
    " , , , , , , , , , , , , , , , ..., , )",
    mkIt(100, (_) => ""),
  );
}
