// 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.

import 'package:scheduled_test/scheduled_test.dart';

import 'package:path/path.dart' as path;

import '../descriptor.dart' as d;
import '../test_pub.dart';

main() {
  initConfig();

  // This is a regression test for dartbug.com/14442.
  //
  // If you have a long chain of path dependencies with long relative paths,
  // you can end up with a combined path that is longer than the OS can handle.
  // For example, the path that revealed this bug was:
  //
  // C:\jenkins-slave\workspace\mSEE-Dev\ozone\dart\portfolio-manager\src\main\
  // portfolio-manager\..\..\..\..\portfolio-common\src\main\portfolio-common\
  // ../../../../dart-visualization/src/main/dart-visualization\lib\src\vega\
  // data\transform\visual
  //
  // This test ensures that we're normalizing at some point before we throw the
  // path at the OS to choke on.

  integration("handles long relative paths", () {
    // Dart2js can take a long time to compile dart code, so we increase the
    // timeout to cope with that.
    currentSchedule.timeout *= 3;

    d.dir("some_long_dependency_name", [
      d.libPubspec("foo", "0.0.1"),
      d.dir("asset", [
        d.file("foo.txt", "foo")
      ])
    ]).create();

    // Build a 2,800 character (non-canonicalized) path.
    var longPath = "";
    for (var i = 0; i < 100; i++)
    {
      longPath = path.join(longPath, "..", "some_long_dependency_name");
    }

    d.dir(appPath, [
      d.appPubspec({
        "foo": {"path": longPath}
      }),
      d.dir("web", [
        d.file("index.html", "html"),
      ])
    ]).create();

    schedulePub(args: ["build"],
        output: new RegExp(r"Built 2 files!"),
        exitCode: 0);

    d.dir(appPath, [
      d.dir('build', [
        d.file("index.html", "html"),
        d.dir('assets', [
          d.dir('foo', [
            d.file('foo.txt', 'foo')
          ])
        ])
      ])
    ]).validate();
  });
}
