// 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/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/compile.dart';

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

void main() {
  testWithoutContext('StdoutHandler can produce output message', () async {
    final StdoutHandler stdoutHandler = StdoutHandler(logger: BufferLogger.test(), fileSystem: MemoryFileSystem.test());
    stdoutHandler.handler('result 12345');
    expect(stdoutHandler.boundaryKey, '12345');
    stdoutHandler.handler('12345');
    stdoutHandler.handler('12345 message 0');
    final CompilerOutput? output = await stdoutHandler.compilerOutput?.future;
    expect(output?.errorCount, 0);
    expect(output?.outputFilename, 'message');
    expect(output?.expressionData, null);
  });

  testWithoutContext('StdoutHandler can read output bytes', () async {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final StdoutHandler stdoutHandler = StdoutHandler(logger: BufferLogger.test(), fileSystem: fileSystem);
    fileSystem.file('message').writeAsBytesSync(<int>[1, 2, 3 ,4]);

    stdoutHandler.reset(readFile: true);
    stdoutHandler.handler('result 12345');
    expect(stdoutHandler.boundaryKey, '12345');
    stdoutHandler.handler('12345');
    stdoutHandler.handler('12345 message 0');
    final CompilerOutput? output = await stdoutHandler.compilerOutput?.future;

    expect(output?.errorCount, 0);
    expect(output?.outputFilename, 'message');
    expect(output?.expressionData, <int>[1, 2, 3, 4]);
  });

  testWithoutContext('StdoutHandler reads output bytes if errorCount > 0', () async {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final StdoutHandler stdoutHandler = StdoutHandler(logger: BufferLogger.test(), fileSystem: fileSystem);
    fileSystem.file('message').writeAsBytesSync(<int>[1, 2, 3 ,4]);

    stdoutHandler.reset(readFile: true);
    stdoutHandler.handler('result 12345');
    expect(stdoutHandler.boundaryKey, '12345');
    stdoutHandler.handler('12345');
    stdoutHandler.handler('12345 message 1');
    final CompilerOutput? output = await stdoutHandler.compilerOutput?.future;

    expect(output?.errorCount, 1);
    expect(output?.outputFilename, 'message');
    expect(output?.expressionData, <int>[1, 2, 3, 4]);
  });

  testWithoutContext('TargetModel values', () {
    expect(TargetModel('vm'), TargetModel.vm);
    expect(TargetModel.vm.toString(), 'vm');

    expect(TargetModel('flutter'), TargetModel.flutter);
    expect(TargetModel.flutter.toString(), 'flutter');

    expect(TargetModel('flutter_runner'), TargetModel.flutterRunner);
    expect(TargetModel.flutterRunner.toString(), 'flutter_runner');

    expect(TargetModel('dartdevc'), TargetModel.dartdevc);
    expect(TargetModel.dartdevc.toString(), 'dartdevc');

    expect(() => TargetModel('foobar'), throwsException);
  });

  testWithoutContext('toMultiRootPath maps different URIs', () async {
    expect(toMultiRootPath(Uri.parse('file:///a/b/c'), 'scheme', <String>['/a/b'], false), 'scheme:///c');
    expect(toMultiRootPath(Uri.parse('file:///d/b/c'), 'scheme', <String>['/a/b'], false), 'file:///d/b/c');
    expect(toMultiRootPath(Uri.parse('file:///a/b/c'), 'scheme', <String>['/d/b', '/a/b'], false), 'scheme:///c');
    expect(toMultiRootPath(Uri.parse('file:///a/b/c'), null, <String>[], false), 'file:///a/b/c');
    expect(toMultiRootPath(Uri.parse('org-dartlang-app:///a/b/c'), null, <String>[], false), 'org-dartlang-app:///a/b/c');
    expect(toMultiRootPath(Uri.parse('org-dartlang-app:///a/b/c'), 'scheme', <String>['/d/b'], false), 'org-dartlang-app:///a/b/c');
  });

  testWithoutContext('buildModeOptions removes matching product define', () {
    expect(buildModeOptions(BuildMode.debug, <String>['dart.vm.product=true']), <String>[
      '-Ddart.vm.profile=false',
      '--enable-asserts',
    ]);
  });

  testWithoutContext('buildModeOptions removes matching profile define in debug mode', () {
    expect(buildModeOptions(BuildMode.debug, <String>['dart.vm.profile=true']), <String>[
      '-Ddart.vm.product=false',
      '--enable-asserts',
    ]);
  });

  testWithoutContext('buildModeOptions removes both matching profile and release define in debug mode', () {
    expect(buildModeOptions(BuildMode.debug, <String>['dart.vm.profile=true', 'dart.vm.product=true']), <String>[
      '--enable-asserts',
    ]);
  });

  testWithoutContext('buildModeOptions removes matching profile define in profile mode', () {
    expect(buildModeOptions(BuildMode.profile, <String>['dart.vm.profile=true']), <String>[
      '-Ddart.vm.product=false',
      '--compact-async'
    ]);
  });

  testWithoutContext('buildModeOptions removes both matching profile and release define in profile mode', () {
    expect(buildModeOptions(BuildMode.profile, <String>['dart.vm.profile=false', 'dart.vm.product=true']), <String>[
      '--compact-async'
    ]);
  });
}
