/*!
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

const path = require('path');
const CLIEngine = require('eslint').CLIEngine;

describe('Cordova ESLint configuration', () => {
    const configs = ['index', 'node-tests', 'browser', 'browser-tests'];

    for (const config of configs) {
        it(`loads config "${config}" without throwing`, () => {
            expect(() => new CLIEngine({
                configFile: path.join(__dirname, '..', `${config}.js`),
                useEslintrc: false
            })).not.toThrow();
        });
    }
});
