// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert';
import 'dart:typed_data';

import "package:test/test.dart";

/// Creates a package: URI.
Uri pkg(String packageName, String packagePath) {
  var path =
      "$packageName${packagePath.startsWith('/') ? "" : "/"}$packagePath";
  return Uri(scheme: "package", path: path);
}

// Remove if not used.
String configFromPackages(List<List<String>> packages) => """
{
  "configVersion": 2,
  "packages": [
${packages.map((nu) => """
    {
      "name": "${nu[0]}",
      "rootUri": "${nu[1]}"
    }""").join(",\n")}
  ]
}
""";

/// Mimics a directory structure of [description] and runs [fileTest].
///
/// Description is a map, each key is a file entry. If the value is a map,
/// it's a subdirectory, otherwise it's a file and the value is the content
/// as a string.
void loaderTest(String name, Map<String, Object> description,
    void loaderTest(Uri root, Future<Uint8List> loader(Uri uri))) {
  var root = Uri(scheme: "test", path: "/");
  Future<Uint8List> loader(Uri uri) async {
    var path = uri.path;
    if (!uri.isScheme("test") || !path.startsWith("/")) return null;
    var parts = path.split("/");
    dynamic value = description;
    for (var i = 1; i < parts.length; i++) {
      if (value is! Map<String, dynamic>) return null;
      value = value[parts[i]];
    }
    if (value is String) return utf8.encode(value);
    return null;
  }

  test(name, () => loaderTest(root, loader));
}
