// Copyright (c) 2014, 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 'package:compiler/src/util/command_line.dart';

main() {
  Expect.listEquals(["foo", "bar"], splitLine("foo bar"));
  Expect.listEquals(["foo", "bar"], splitLine("foo bar", windows: true));

  Expect.listEquals(["foo bar"], splitLine(r"foo\ bar"));
  Expect.listEquals(["foo\\", "bar"], splitLine(r"foo\ bar", windows: true));

  Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo\' \"bar"""));
  Expect.listEquals(
      ["foo\\'", '"bar'], splitLine(r"""foo\' \"bar""", windows: true));

  Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo"'" '"'bar"""));
  Expect.throws(() => splitLine(r"""foo"'" '"'bar""", windows: true),
      (e) => e is FormatException);
  Expect.listEquals(
      ["foo'", "''bar"], splitLine(r"""foo"'" '"'bar" """, windows: true));

  Expect.listEquals(["foo", "bar"], splitLine("'f''o''o' " + '"b""a""r"'));
  // TODO(johnniwinther): This is not actual Windows behavior: "b""a" is
  // interpreted as b"a but "b""a""r" is interpreted as b"ar.
  Expect.listEquals(["'f''o''o'", "bar"],
      splitLine("'f''o''o' " + '"b""a""r"', windows: true));

  Expect.listEquals(
      ["\n", "\r", "\t", "\b", "\f", "\v", "\\", "a", "Z", "-", '"', "'"],
      splitLine(r"""\n \r \t \b \f \v \\ \a \Z \- \" \'"""));
  Expect.listEquals([
    "\\n",
    "\\r",
    "\\t",
    "\\b",
    "\\f",
    "\\v",
    "\\",
    "\\a",
    "\\Z",
    "\\-",
    '"',
    "\\'"
  ], splitLine(r"""\n \r \t \b \f \v \\ \a \Z \- \" \'""", windows: true));
  Expect.listEquals(
      ["C:Users\foo\bar\baz.dart"], splitLine(r"C:\Users\foo\bar\baz.dart"));
  Expect.listEquals([r"C:\Users\foo\bar\baz.dart"],
      splitLine(r"C:\Users\foo\bar\baz.dart", windows: true));

  Expect.listEquals(["C:Users\foo\bar\name with spaces.dart"],
      splitLine(r'"C:\Users\foo\bar\name with spaces.dart"'));
  Expect.listEquals([r"C:\Users\foo\bar\name with spaces.dart"],
      splitLine(r'"C:\Users\foo\bar\name with spaces.dart"', windows: true));

  Expect.throws(() => splitLine(r"\"), (e) => e is FormatException);
  Expect.throws(
      () => splitLine(r"\", windows: true), (e) => e is FormatException);
}
