// Copyright 2020 The Fuchsia Authors. 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:fxutils/fxutils.dart';
import 'package:test/test.dart';

void main() {
  group('FxEnv locates Fuchsia directories correctly', () {
    test('when the build directory is inside the checkout', () {
      var rootLocator = FxEnv.env({
        'FUCHSIA_DIR': '/root/path/fuchsia',
        'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
      });
      expect(rootLocator.fuchsiaDir, '/root/path/fuchsia');
      expect(rootLocator.outputDir, '/root/path/fuchsia/out/default');
      expect(rootLocator.relativeOutputDir, '/out/default');
      expect(rootLocator.userFriendlyOutputDir, '//out/default');
    });

    test('when the build directory is inside the checkout from `environment`',
        () {
      var rootLocator = FxEnv.env({
        'FUCHSIA_DIR': '/root/path/fuchsia',
        'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
      });
      expect(rootLocator.fuchsiaDir, '/root/path/fuchsia');
      expect(rootLocator.outputDir, '/root/path/fuchsia/out/default');
      expect(rootLocator.relativeOutputDir, '/out/default');
      expect(rootLocator.userFriendlyOutputDir, '//out/default');
    });

    test(
        'when the build directory is inside the checkout from `environment` '
        'and `overrides`', () {
      var envReader = EnvReader(
        cwd: '/cwd',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
        },
        overrides: {
          'FUCHSIA_DIR': '/custom/path',
          'FUCHSIA_BUILD_DIR': '/custom/path/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.fuchsiaDir, '/custom/path');
      expect(rootLocator.outputDir, '/custom/path/out/default');
      expect(rootLocator.relativeOutputDir, '/out/default');
      expect(rootLocator.userFriendlyOutputDir, '//out/default');
    });

    test('when the cwd is requested from the build dir itself', () {
      var envReader = EnvReader(
        cwd: '/root/path/fuchsia/out/default',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.relativeCwd, '.');
    });

    test('when the cwd is requested from the build dir itself with `env`', () {
      var envReader = EnvReader(
        cwd: '/root/path/fuchsia/out/default',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.relativeCwd, '.');
    });

    test('when the cwd is requested from within the build dir', () {
      var envReader = EnvReader(
        cwd: '/root/path/fuchsia/out/default/host_x64',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.relativeCwd, 'host_x64');
    });

    test(
        'when the cwd is requested from within the tree but not within '
        'the build dir', () {
      var envReader = EnvReader(
        cwd: '/root/path/fuchsia/tools',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/fuchsia/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.relativeCwd, '/root/path/fuchsia/tools');
    });

    test('when fuchsia tree directory path does not contain "fuchsia"', () {
      var envReader = EnvReader(
        cwd: '/root/path/dev/out/default',
        environment: {
          'FUCHSIA_DIR': '/root/path/fuchsia',
          'FUCHSIA_BUILD_DIR': '/root/path/dev/out/default',
        },
      );
      var rootLocator = FxEnv(envReader: envReader);
      expect(rootLocator.relativeCwd, '.');
    });
  });

  group('FxEnv', () {
    test('should return specific env variables when they are passed', () {
      final fxEnv = FxEnv.env({'FUCHSIA_DIR': '/some/path'});
      expect(fxEnv.fuchsiaDir, equals('/some/path'));
    });
  });
}
