// Copyright (c) 2018, 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:io';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/serialization/strategies.dart';
import 'package:expect/expect.dart';
import 'serialization_test_helper.dart';

main(List<String> args) {
  asyncTest(() async {
    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
    Directory libDir = new Directory.fromUri(Platform.script.resolve('libs'));
    await checkTests(dataDir, options: [], args: args, libDirectory: libDir);
  });
}

Future checkTests(Directory dataDir,
    {bool testStrongMode: true,
    List<String> options: const <String>[],
    List<String> args: const <String>[],
    Directory libDirectory: null,
    bool forUserLibrariesOnly: true,
    int shards: 1,
    int shardIndex: 0,
    void onTest(Uri uri)}) async {
  args = args.toList();
  bool shouldContinue = args.remove('-c');
  bool continued = false;
  bool hasFailures = false;
  SerializationStrategy strategy = const BytesInMemorySerializationStrategy();
  if (args.remove('-d')) {
    strategy = const ObjectsInMemorySerializationStrategy();
  }

  var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
  print('Data dir: ${relativeDir}');
  List<FileSystemEntity> entities = dataDir.listSync();
  if (shards > 1) {
    int start = entities.length * shardIndex ~/ shards;
    int end = entities.length * (shardIndex + 1) ~/ shards;
    entities = entities.sublist(start, end);
  }
  int testCount = 0;
  for (FileSystemEntity entity in entities) {
    String name = entity.uri.pathSegments.last;
    if (args.isNotEmpty && !args.contains(name) && !continued) continue;
    if (shouldContinue) continued = true;
    testCount++;
    List<String> testOptions = options.toList();
    if (onTest != null) {
      onTest(entity.uri);
    }
    print('----------------------------------------------------------------');
    print('Test file: ${entity.uri}');
    // Pretend this is a dart2js_native test to allow use of 'native' keyword
    // and import of private libraries.
    String commonTestPath = 'sdk/tests/compiler';
    Uri entryPoint =
        Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
    String mainCode = await new File.fromUri(entity.uri).readAsString();
    Map<String, String> memorySourceFiles = {entryPoint.path: mainCode};

    if (libDirectory != null) {
      print('Supporting libraries:');
      String filePrefix = name.substring(0, name.lastIndexOf('.'));
      await for (FileSystemEntity libEntity in libDirectory.list()) {
        String libFileName = libEntity.uri.pathSegments.last;
        if (libFileName.startsWith(filePrefix)) {
          print('    - libs/$libFileName');
          Uri libFileUri =
              Uri.parse('memory:$commonTestPath/libs/$libFileName');
          String libCode = await new File.fromUri(libEntity.uri).readAsString();
          memorySourceFiles[libFileUri.path] = libCode;
        }
      }
    }

    await runTest(
        entryPoint: entryPoint,
        memorySourceFiles: memorySourceFiles,
        options: testOptions,
        strategy: strategy);
  }
  Expect.isFalse(hasFailures, 'Errors found.');
  Expect.isTrue(testCount > 0, "No files were tested.");
}
