// 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/logger.dart';
import 'package:flutter_tools/src/persistent_tool_state.dart';
import 'package:flutter_tools/src/version.dart';

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

void main() {
  testWithoutContext('state can be set and persists', () {
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
    final Directory directory = fileSystem.directory('state_dir');
    directory.createSync();
    final File stateFile = directory.childFile('.flutter_tool_state');
    final PersistentToolState state1 = PersistentToolState.test(
      directory: directory,
      logger: BufferLogger.test(),
    );
    expect(state1.redisplayWelcomeMessage, null);
    state1.redisplayWelcomeMessage = true;
    expect(stateFile.existsSync(), true);
    expect(state1.redisplayWelcomeMessage, true);
    state1.redisplayWelcomeMessage = false;
    expect(state1.redisplayWelcomeMessage, false);

    final PersistentToolState state2 = PersistentToolState.test(
      directory: directory,
      logger: BufferLogger.test(),
    );
    expect(state2.redisplayWelcomeMessage, false);
  });

  testWithoutContext('channel versions can be cached and stored', () {
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();
    final Directory directory = fileSystem.directory('state_dir')..createSync();
    final PersistentToolState state1 = PersistentToolState.test(
      directory: directory,
      logger: BufferLogger.test(),
    );

    state1.updateLastActiveVersion('abc', Channel.master);
    state1.updateLastActiveVersion('def', Channel.dev);
    state1.updateLastActiveVersion('ghi', Channel.beta);
    state1.updateLastActiveVersion('jkl', Channel.stable);

    final PersistentToolState state2 = PersistentToolState.test(
      directory: directory,
      logger: BufferLogger.test(),
    );

    expect(state2.lastActiveVersion(Channel.master), 'abc');
    expect(state2.lastActiveVersion(Channel.dev), 'def');
    expect(state2.lastActiveVersion(Channel.beta), 'ghi');
    expect(state2.lastActiveVersion(Channel.stable), 'jkl');
  });
}
