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