1*082815dcSEvan Baconimport { findMatchingBracketPosition } from '../matchBrackets';
2*082815dcSEvan Bacon
3*082815dcSEvan Bacondescribe(findMatchingBracketPosition, () => {
4*082815dcSEvan Bacon  it('should handle one line search', () => {
5*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo()', '(')).toBe(4);
6*082815dcSEvan Bacon    expect(findMatchingBracketPosition('withParameter("a", 1, null)', '(')).toBe(26);
7*082815dcSEvan Bacon  });
8*082815dcSEvan Bacon
9*082815dcSEvan Bacon  it('should handle backward search', () => {
10*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo()', ')')).toBe(3);
11*082815dcSEvan Bacon    expect(findMatchingBracketPosition('withParameter("a", 1, null)', ')')).toBe(13);
12*082815dcSEvan Bacon  });
13*082815dcSEvan Bacon
14*082815dcSEvan Bacon  it('should handle nested brackets call', () => {
15*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo(boo(), 0)', '(')).toBe(12);
16*082815dcSEvan Bacon  });
17*082815dcSEvan Bacon
18*082815dcSEvan Bacon  it('should handle nested brackets multi-lines call', () => {
19*082815dcSEvan Bacon    const content = `
20*082815dcSEvan Baconvoid foo() {
21*082815dcSEvan Bacon  doSomething();
22*082815dcSEvan Bacon  if (doSomeCheck(123)) {
23*082815dcSEvan Bacon    return -1;
24*082815dcSEvan Bacon  }
25*082815dcSEvan Bacon  return 0;
26*082815dcSEvan Bacon}`;
27*082815dcSEvan Bacon    const lastBrace = content.length - 1;
28*082815dcSEvan Bacon    expect(findMatchingBracketPosition(content, '{')).toBe(lastBrace);
29*082815dcSEvan Bacon
30*082815dcSEvan Bacon    // `findMatchingBracketPosition` will search first `bracket` in forward direction first
31*082815dcSEvan Bacon    // and search matching bracket either forward or backward.
32*082815dcSEvan Bacon    // In this case, search `'}'` will match the ended bracket of `if (doSomeCheck(123)) {` block.
33*082815dcSEvan Bacon    const firstBrace = content.indexOf('{');
34*082815dcSEvan Bacon    const secondBrace = content.indexOf('{', firstBrace + 1);
35*082815dcSEvan Bacon    expect(findMatchingBracketPosition(content, '}')).toBe(secondBrace);
36*082815dcSEvan Bacon  });
37*082815dcSEvan Bacon
38*082815dcSEvan Bacon  it('should return -1 for not found cases', () => {
39*082815dcSEvan Bacon    expect(findMatchingBracketPosition('', '(')).toBe(-1);
40*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo', '(')).toBe(-1);
41*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo(', '(')).toBe(-1);
42*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo()', '{')).toBe(-1);
43*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo()', '}')).toBe(-1);
44*082815dcSEvan Bacon    expect(findMatchingBracketPosition('foo(bar()', '(')).toBe(-1);
45*082815dcSEvan Bacon  });
46*082815dcSEvan Bacon});
47