// 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();
    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();
    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');
  });
}
