// 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:flutter_tools/src/convert.dart';
import '../src/common.dart';
import 'test_utils.dart';

/// Checks that all active template files are defined in the template_manifest.json file.
void main() {
  testWithoutContext('Check template manifest is up to date', () {
    final Map<String, Object> manifest = json.decode(
      fileSystem.file('templates/template_manifest.json').readAsStringSync(),
    ) as Map<String, Object>;
    final Set<Uri> declaredFileList = Set<Uri>.from(
      (manifest['files'] as List<Object>).cast<String>().map<Uri>(fileSystem.path.toUri));

    final Set<Uri> activeTemplateList = fileSystem.directory('templates')
      .listSync(recursive: true)
      .whereType<File>()
      .where((File file) => fileSystem.path.basename(file.path) != 'template_manifest.json' &&
        fileSystem.path.basename(file.path) != '.DS_Store')
      .map((File file) => file.uri)
      .toSet();

    final Set<Uri> difference = activeTemplateList.difference(declaredFileList);

    expect(difference, isEmpty, reason: 'manifest and template directory should be in-sync');
  });
}
