// 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);
}
