| import 'jasmine'; |
| import {ConformancePatternRule, PatternKind} from '../../rules/conformance_pattern_rule'; |
| import {compileAndCheck, customMatchers} from '../../util/testing/test_support'; |
| |
| describe('BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT', () => { |
| const config = { |
| errorMessage: 'do not call bar.foo with non-literal 1st arg', |
| kind: PatternKind.BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT, |
| values: ['bar:0'] |
| }; |
| const rule = new ConformancePatternRule(config); |
| |
| it('matches simple examples', () => { |
| const sources = [ |
| `export function bar(x:any, y:any) {}`, |
| `import * as foo from './file_0'; ` + |
| `foo.bar(1, 1); foo.bar(window.name, 1);`, |
| ]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveFailuresMatching({ |
| matchedCode: `foo.bar(window.name, 1)`, |
| messageText: 'do not call bar.foo with non-literal 1st arg' |
| }); |
| }); |
| |
| it('looks at the right position', () => { |
| const sources = [ |
| `export function bar(x:any, y:any) {}`, |
| `import * as foo from './file_0'; foo.bar(1, window.name);`, |
| ]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveNoFailures(); |
| }); |
| |
| it('looks at the right position', () => { |
| const rule = new ConformancePatternRule({ |
| errorMessage: 'non-literal arg', |
| kind: PatternKind.BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT, |
| values: ['aaa:1', 'bbb:0'] |
| }); |
| |
| const sources = [ |
| `export function aaa(x:any, y:any) {}; export function bbb(x:any) {}`, |
| `import * as foo from './file_0'; ` + |
| `foo.aaa(1, window.name); foo.bbb(window.name);`, |
| ]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveFailuresMatching( |
| { |
| matchedCode: `foo.aaa(1, window.name)`, |
| }, |
| { |
| matchedCode: `foo.bbb(window.name)`, |
| }); |
| }); |
| |
| it('supports static methods', () => { |
| const rule = new ConformancePatternRule({ |
| errorMessage: 'non-literal arg', |
| kind: PatternKind.BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT, |
| values: ['Car.buildFromParts:0'] |
| }); |
| |
| const sources = [ |
| `export class Car { static buildFromParts(name:string):void {}; }`, |
| `import {Car} from './file_0';\n` + |
| `Car.buildFromParts(window.name);\n` + |
| `Car.buildFromParts('hello');`, |
| ]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveFailuresMatching({ |
| matchedCode: `Car.buildFromParts(window.name)`, |
| }); |
| }); |
| |
| it('supports ambient global methods', () => { |
| const rule = new ConformancePatternRule({ |
| errorMessage: 'non-literal arg', |
| kind: PatternKind.BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT, |
| values: ['URL.createObjectURL:0'] |
| }); |
| |
| const sources = [`URL.createObjectURL(window.name);\n`]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveFailuresMatching({ |
| matchedCode: `URL.createObjectURL(window.name)`, |
| }); |
| }); |
| |
| it('supports ambient global methods', () => { |
| const rule = new ConformancePatternRule({ |
| errorMessage: 'non-literal arg', |
| kind: PatternKind.BANNED_NAME_CALL_NON_CONSTANT_ARGUMENT, |
| values: ['eval:0'] |
| }); |
| |
| const sources = [`eval(window.name);\n`]; |
| const results = compileAndCheck(rule, ...sources); |
| |
| expect(results).toHaveFailuresMatching({ |
| matchedCode: `eval(window.name)`, |
| }); |
| }); |
| }); |
| |
| beforeEach(() => { |
| jasmine.addMatchers(customMatchers); |
| }); |