// Copyright 2014 The Flutter 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:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/cache.dart';

import '../../src/common.dart';

void main() {
  testWithoutContext('Cache can initialize flutter root from environment variable', () {
    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: MemoryFileSystem.test(),
        userMessages: UserMessages(),
        platform: FakePlatform(
            environment: <String, String>{
              'FLUTTER_ROOT': 'path/to/flutter'
            }
        )
    );

    expect(defaultFlutterRoot, '/path/to/flutter');
  });

  testWithoutContext('Cache can initialize flutter root data-scheme platform script', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    // For data-uri, the root is initialized to ../.. and then normalized. Change the
    // current directory to verify this.
    final Directory directory = fileSystem.directory('foo/bar/baz/')
      ..createSync(recursive: true);
    fileSystem.currentDirectory = directory;

    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: fileSystem,
        userMessages: UserMessages(),
        platform: FakePlatform(
          environment: <String, String>{},
          script: Uri.parse('data:,Hello%2C%20World!'),
        )
    );

    expect(defaultFlutterRoot, '/foo');
  });

  testWithoutContext('Cache can initialize flutter root package-scheme platform script', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: fileSystem,
        userMessages: UserMessages(),
        platform: FakePlatform(
            environment: <String, String>{},
            script: Uri.parse('package:flutter_tools/flutter_tools.dart'),
            packageConfig: 'flutter/packages/flutter_tools/.packages'
        )
    );

    expect(defaultFlutterRoot, '/flutter');
  });

  testWithoutContext('Cache can initialize flutter root from snapshot location', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: fileSystem,
        userMessages: UserMessages(),
        platform: FakePlatform(
          environment: <String, String>{},
          script: Uri.parse('file:///flutter/bin/cache/flutter_tools.snapshot'),
        )
    );

    expect(defaultFlutterRoot, '/flutter');
  });

  testWithoutContext('Cache can initialize flutter root from script file', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: fileSystem,
        userMessages: UserMessages(),
        platform: FakePlatform(
          environment: <String, String>{},
          script: Uri.parse('file:///flutter/packages/flutter_tools/bin/flutter_tools.dart'),
        )
    );

    expect(defaultFlutterRoot, '/flutter');
  });

  testWithoutContext('Cache will default to current directory if there are no matches', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final String defaultFlutterRoot = Cache.defaultFlutterRoot(
        fileSystem: fileSystem,
        userMessages: UserMessages(),
        platform: FakePlatform(
          environment: <String, String>{},
          script: Uri.parse('http://foo.bar'), // does not match any heuristics.
        )
    );

    expect(defaultFlutterRoot, '/');
  });
}
