// Copyright (c) 2013, 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.

library analyze_library_test_config;

import 'dart:io';
import '../../../tools/testing/dart/test_suite.dart';

class AnalyzeLibraryTestSuite extends DartcCompilationTestSuite {
  final libraries = [ 'async', 'core', 'crypto', 'io', 'isolate', 'json',
                      'math', 'mirrors', 'typed_data', 'uri',
                      'utf' ];

  AnalyzeLibraryTestSuite(Map configuration)
      : super(configuration,
              'analyze_library',
              'sdk',
              [ 'lib' ],
              ['tests/lib/analyzer/analyze_library.status'],
              allStaticClean: true);

  bool isTestFile(String filename) {
    var sep = Platform.pathSeparator;
    return libraries.any((String lib) {
      return filename.endsWith('lib$sep$lib$sep$lib.dart');
    });
  }

  bool get listRecursively => true;
}


class AnalyzeTestsTestSuite extends DartcCompilationTestSuite {
  AnalyzeTestsTestSuite(Map configuration)
      : super(configuration,
              'analyze_tests',
              'tests',
              [ 'standalone' ],
              ['tests/lib/analyzer/analyze_tests.status'],
              allStaticClean: true);

  bool isTestFile(String filename) {
    return filename.endsWith('_test.dart');
  }

  bool get listRecursively => true;
}
