import 'jasmine';
import {ConformancePatternRule, PatternKind} from '../../rules/conformance_pattern_rule';
import {WhitelistReason} from '../../util/pattern_config';
import {compileAndCheck, customMatchers, getTempDirForWhitelist} from '../../util/testing/test_support';

const tmpPrefixForWhitelist = getTempDirForWhitelist();
const tmpRegexpForWhitelist =
    `^(?:${getTempDirForWhitelist().replace(/\\/g, '\\\\')})`;


describe('ConformancePatternRule', () => {
  describe('whitelist handling', () => {
    const source = `export {};\n` +
        `const q = document.createElement('q');\n` +
        `q.cite = 'some example string';\n`;

    // The initial config off which we run those checks.
    const baseConfig = {
      errorMessage: 'do not cite',
      kind: PatternKind.BANNED_PROPERTY_WRITE,
      values: ['HTMLQuoteElement.prototype.cite'],
    };

    it('matches if no whitelist (sanity check)', () => {
      const config = {...baseConfig, whitelistEntries: []};
      const rule = new ConformancePatternRule(config);
      const results = compileAndCheck(rule, source);

      expect(results).toHaveNFailures(1, config);
    });

    it('matches if there is an empty whitelist group', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
        }]
      };
      const rule = new ConformancePatternRule(config);
      const results = compileAndCheck(rule, source);

      expect(results).toHaveNFailures(1, config);
    });

    it('respects prefix-based whitelists (matching test)', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
          prefix: [tmpPrefixForWhitelist],
        }]
      };
      const rule = new ConformancePatternRule(config);
      const results = compileAndCheck(rule, source);

      expect(results).toHaveNFailures(0, config);
    });

    it('respects prefix-based whitelists (non-matching test)', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
          prefix: ['/nowhere in particular/'],
        }]
      };
      const rule = new ConformancePatternRule(config);
      const results = compileAndCheck(rule, source);

      expect(results).toHaveNFailures(1, config);
    });

    it('respects regex-based whitelists', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
          regexp: [`${tmpRegexpForWhitelist}.+/file_0\\.ts`]
        }]
      };
      const rule = new ConformancePatternRule(config);
      const results = compileAndCheck(rule, source);

      expect(results).toHaveNFailures(0, config);
    });

    it('accepts several regex-based whitelists', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
          regexp: [
            `${tmpRegexpForWhitelist}.+/file_0\\.ts`,
            `${tmpRegexpForWhitelist}.+/file_1\\.ts`
          ]
        }]
      };
      const rule = new ConformancePatternRule(config);
      // Testing two times the same file so that both regexps match.
      const results = compileAndCheck(rule, source, source);

      expect(results).toHaveNFailures(0, config);
    });

    it('throws on creation of invalid regexps', () => {
      const config = {
        ...baseConfig,
        whitelistEntries: [{
          reason: WhitelistReason.UNSPECIFIED,
          regexp: ['(', '/tmp/', 'foo'],
        }]
      };
      expect(() => {
        new ConformancePatternRule(config);
      }).toThrowError(/Invalid regular expression/);
    });
  });
});

beforeEach(() => {
  jasmine.addMatchers(customMatchers);
});
