// Copyright (c) 2016, 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:path/path.dart' as p;
import 'package:test/test.dart';

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

const _script = """
  import 'dart:isolate';

  main() async {
    print(await Isolate.packageConfig);
    print(await Isolate.resolvePackageUri(
        Uri.parse('package:myapp/resource.txt')));
    print(await Isolate.resolvePackageUri(
        Uri.parse('package:foo/resource.txt')));
  }
""";

void main() {
  test('an untransformed application sees a file: package config', () async {
    await d.dir('foo', [d.libPubspec('foo', '1.0.0')]).create();

    await d.dir(appPath, [
      d.appPubspec(
        dependencies: {
          'foo': {'path': '../foo'},
        },
      ),
      d.dir('bin', [d.file('script.dart', _script)]),
    ]).create();

    await pubGet();
    var pub = await pubRun(args: ['bin/script']);

    expect(
      pub.stdout,
      emitsThrough(
        p
            .toUri(p.join(d.sandbox, 'myapp/.dart_tool/package_config.json'))
            .toString(),
      ),
    );
    expect(
      pub.stdout,
      emits(p.toUri(p.join(d.sandbox, 'myapp/lib/resource.txt')).toString()),
    );
    expect(
      pub.stdout,
      emits(p.toUri(p.join(d.sandbox, 'foo/lib/resource.txt')).toString()),
    );
    await pub.shouldExit(0);
  });

  test('a snapshotted application sees a file: package root', () async {
    final server = await servePackages();
    server.serve(
      'foo',
      '1.0.0',
      contents: [
        d.dir('bin', [d.file('script.dart', _script)]),
      ],
    );

    await d.dir(appPath, [
      d.appPubspec(dependencies: {'foo': 'any'}),
    ]).create();

    await pubGet();

    var pub = await pubRun(args: ['foo:script']);

    expect(pub.stdout, emitsThrough('Building package executable...'));
    expect(pub.stdout, emits('Built foo:script.'));
    expect(
      pub.stdout,
      emits(
        p
            .toUri(p.join(d.sandbox, 'myapp/.dart_tool/package_config.json'))
            .toString(),
      ),
    );
    expect(
      pub.stdout,
      emits(p.toUri(p.join(d.sandbox, 'myapp/lib/resource.txt')).toString()),
    );
    var fooResourcePath =
        p.join(globalServer.pathInCache('foo', '1.0.0'), 'lib/resource.txt');
    expect(pub.stdout, emits(p.toUri(fooResourcePath).toString()));
    await pub.shouldExit(0);
  });
}
