/*
 * Copyright (c) 2017, 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.
 */
/**
 * @assertion String join([String separator = "" ])
 * Converts each element to a String and concatenates the strings.
 * Iterates through elements of this iterable, converts each one to a String by
 * calling Object.toString, and then concatenates the strings, with the
 * separator string interleaved between the elements.
 * @description Checks that the correct value is returned.
 * @author ngl@unipro.ru
 */

import "dart:typed_data";
import "../../../Utils/expect.dart";

Float64x2 f64x2(v) => new Float64x2.splat(v);

void check(List<Float64x2> list, String separator, String expected) {
  var l = new Float64x2List.fromList(list);
  var res = l.join(separator);
  Expect.equals(expected, res);
}

main() {
  check([], "", "");
  check([], ", ", "");
  check([f64x2(1.123456)], "", "[1.123456, 1.123456]");
  check([f64x2(1.123456)], ", ", "[1.123456, 1.123456]");
  check([f64x2(1.123456), f64x2(2.123456), f64x2(3.123456), f64x2(4.123456), f64x2(5.123456)], "",
      "[1.123456, 1.123456][2.123456, 2.123456][3.123456, 3.123456]"
      "[4.123456, 4.123456][5.123456, 5.123456]"
  );
  check([f64x2(1.123456), f64x2(2.123456), f64x2(3.123456), f64x2(4.123456), f64x2(5.123456)], " ",
      "[1.123456, 1.123456] [2.123456, 2.123456] [3.123456, 3.123456] "
      "[4.123456, 4.123456] [5.123456, 5.123456]"
  );
}
