// 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:flutter_tools/src/base/platform.dart';

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

void _expectPlatformsEqual(Platform actual, Platform expected) {
  expect(actual.numberOfProcessors, expected.numberOfProcessors);
  expect(actual.pathSeparator, expected.pathSeparator);
  expect(actual.operatingSystem, expected.operatingSystem);
  expect(actual.operatingSystemVersion, expected.operatingSystemVersion);
  expect(actual.localHostname, expected.localHostname);
  expect(actual.environment, expected.environment);
  expect(actual.executable, expected.executable);
  expect(actual.resolvedExecutable, expected.resolvedExecutable);
  expect(actual.script, expected.script);
  expect(actual.executableArguments, expected.executableArguments);
  expect(actual.packageConfig, expected.packageConfig);
  expect(actual.version, expected.version);
  expect(actual.localeName, expected.localeName);
}

void main() {
  group('FakePlatform.fromPlatform', () {
    late FakePlatform fake;
    late LocalPlatform local;

    setUp(() {
      local = const LocalPlatform();
      fake = FakePlatform.fromPlatform(local);
    });

    testWithoutContext('copiesAllProperties', () {
      _expectPlatformsEqual(fake, local);
    });

    testWithoutContext('convertsPropertiesToMutable', () {
      final String key = fake.environment.keys.first;

      expect(fake.environment[key], local.environment[key]);
      fake.environment[key] = 'FAKE';
      expect(fake.environment[key], 'FAKE');

      expect(
        fake.executableArguments.length,
        local.executableArguments.length,
      );
      fake.executableArguments.add('ARG');
      expect(fake.executableArguments.last, 'ARG');
    });
  });
}
