/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

const browserProvidersConf = require('../../browser-providers.conf');
const {generateSeed} = require('../../tools/jasmine-seed-generator');

// Karma configuration
module.exports = function(config) {
  config.set({

    basePath: '../../',

    frameworks: ['jasmine'],

    client: {
      jasmine: {
        random: true,
        seed: generateSeed('router/karma.conf'),
      },
    },

    files: [
      // Polyfills.
      'node_modules/core-js/client/core.js',
      'node_modules/reflect-metadata/Reflect.js',
      'third_party/shims_for_IE.js',

      // System.js for module loading
      'node_modules/systemjs/dist/system-polyfills.js',
      'node_modules/systemjs/dist/system.src.js',

      // Zone.js dependencies
      'dist/bin/packages/zone.js/npm_package/bundles/zone.umd.js',
      'dist/bin/packages/zone.js/npm_package/bundles/zone-testing.umd.js',

      {pattern: 'node_modules/rxjs/**/*', included: false, watched: false},

      // shim
      {pattern: 'packages/router/karma-test-shim.js', included: true, watched: true},

      // Angular modules
      {pattern: 'dist/all/@angular/core/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/core/src/**/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/core/testing/**/*.js', included: false, watched: false},

      {pattern: 'dist/all/@angular/common/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/common/src/**/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/common/testing/**/*.js', included: false, watched: false},

      {pattern: 'dist/all/@angular/compiler/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/compiler/src/**/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/compiler/testing/**/*.js', included: false, watched: false},

      {pattern: 'dist/all/@angular/platform-browser/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/platform-browser/src/**/*.js', included: false, watched: false},
      {
        pattern: 'dist/all/@angular/platform-browser/testing/**/*.js',
        included: false,
        watched: false
      },

      {pattern: 'dist/all/@angular/platform-browser-dynamic/*.js', included: false, watched: false},
      {
        pattern: 'dist/all/@angular/platform-browser-dynamic/src/**/*.js',
        included: false,
        watched: false
      },
      {
        pattern: 'dist/all/@angular/platform-browser-dynamic/testing/**/*.js',
        included: false,
        watched: false
      },

      {pattern: 'dist/all/@angular/private/testing/**/*.js', included: false, watched: false},

      {pattern: 'dist/all/@angular/upgrade/static/*.js', included: false, watched: false},
      {pattern: 'dist/all/@angular/upgrade/static/src/**/*.js', included: false, watched: false},

      // Router
      {pattern: 'dist/all/@angular/router/**/*.js', included: false, watched: true}
    ],

    customLaunchers: browserProvidersConf.customLaunchers,

    plugins: [
      'karma-jasmine',
      'karma-browserstack-launcher',
      'karma-sauce-launcher',
      'karma-chrome-launcher',
      'karma-sourcemap-loader',
    ],

    preprocessors: {
      '**/*.js': ['sourcemap'],
    },

    reporters: ['dots'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false,
    captureTimeout: 60000,
    browserDisconnectTimeout: 60000,
    browserDisconnectTolerance: 3,
    browserNoActivityTimeout: 60000,
  });
};
