// 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:snippets/snippets.dart';
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;

void main() {
  group('Configuration', () {
    final MemoryFileSystem memoryFileSystem = MemoryFileSystem();
    late SnippetConfiguration config;

    setUp(() {
      config = FlutterRepoSnippetConfiguration(
        flutterRoot: memoryFileSystem.directory('/flutter sdk'),
        filesystem: memoryFileSystem,
      );
    });
    test('config directory is correct', () async {
      expect(config.configDirectory.path,
          matches(RegExp(r'[/\\]flutter sdk[/\\]dev[/\\]snippets[/\\]config')));
    });
    test('skeleton directory is correct', () async {
      expect(
          config.skeletonsDirectory.path,
          matches(RegExp(
              r'[/\\]flutter sdk[/\\]dev[/\\]snippets[/\\]config[/\\]skeletons')));
    });
    test('html skeleton file for sample is correct', () async {
      expect(
          config.getHtmlSkeletonFile('snippet').path,
          matches(RegExp(
              r'[/\\]flutter sdk[/\\]dev[/\\]snippets[/\\]config[/\\]skeletons[/\\]snippet.html')));
    });
    test('html skeleton file for app with no dartpad is correct', () async {
      expect(
          config.getHtmlSkeletonFile('sample').path,
          matches(RegExp(
              r'[/\\]flutter sdk[/\\]dev[/\\]snippets[/\\]config[/\\]skeletons[/\\]sample.html')));
    });
    test('html skeleton file for app with dartpad is correct', () async {
      expect(
          config.getHtmlSkeletonFile('dartpad').path,
          matches(RegExp(
              r'[/\\]flutter sdk[/\\]dev[/\\]snippets[/\\]config[/\\]skeletons[/\\]dartpad-sample.html')));
    });
  });
}
