Given typescriptreact (basic usage):
  var a = <div></div>
  var b = 123

Execute:
  AssertEqual 'tsxTag', SyntaxAt(1, 9)
  AssertEqual 'tsxIntrinsicTagName', SyntaxAt(1, 10)
  AssertEqual 'typescriptVariable', SyntaxAt(2, 1)

Given typescriptreact (basic void):
  var a = <img/>
  var b = 123

Execute:
  AssertEqual 'tsxTag', SyntaxAt(1, 9)
  AssertEqual 'tsxIntrinsicTagName', SyntaxAt(1, 10)
  AssertEqual 'typescriptVariable', SyntaxAt(2, 1)

Given typescriptreact (interpolation):
  var a = <Option key={item}></Option>;
  var b = 123

Execute:
  AssertEqual 'tsxTagName', SyntaxAt(1, 10)
  AssertEqual 'tsxTagName', SyntaxAt(1, 30)
  AssertEqual 'typescriptVariable', SyntaxAt(2, 1)

Given typescriptreact (custom component):
  var a = <ion-gesture></ion-gesture>;
  var b = 123

Execute:
  AssertEqual 'tsxTag', SyntaxAt(1, 9)
  AssertEqual 'tsxIntrinsicTagName', SyntaxAt(1, 30)
  AssertEqual 'typescriptVariable', SyntaxAt(2, 1)

Given typescriptreact (digit in tagname):
  var a = <h1></h1>;
  var b = 123

Execute:
  AssertEqual 'tsxTag', SyntaxAt(1, 9)
  AssertEqual 'tsxIntrinsicTagName', SyntaxAt(1, 16)
  AssertEqual 'typescriptVariable', SyntaxAt(2, 1)

Given typescriptreact (paren + render props):
  var d =  (
    <Route component={() => <Home/>}/>
  )

Execute:
  AssertEqual 'tsxTagName', SyntaxAt(2, 4)

Given typescriptreact (attributes):
  var d = <Route component={() => <Home/>}
    another-attribute="1"
  />

Execute:
  AssertEqual 'tsxTagName', SyntaxAt(1, 10)
  AssertEqual 'tsxTagName', SyntaxAt(1, 34)
  AssertEqual 'tsxAttrib', SyntaxAt(1, 16)
  AssertEqual 'tsxAttrib', SyntaxAt(2, 3)
  AssertEqual 'tsxAttrib', SyntaxAt(2, 11)

Given typescriptreact (paren + attributes):
  var d = (
    <Route component={() => <Home/>}
      another-attribute="1"
    />
  )

Execute:
  AssertEqual 'tsxAttrib', SyntaxAt(2, 10)
  AssertEqual 'tsxTagName', SyntaxAt(2, 28)
  AssertEqual 'tsxAttrib', SyntaxAt(3, 5)
  AssertEqual 'tsxAttrib', SyntaxAt(3, 13)

Given typescriptreact (object in jsx attribute):
  var d = <Route component={{ test: 1 }}
    another-attribute="1"
  />

Execute:
  AssertEqual 'typescriptObjectLiteral', SyntaxAt(1, 28)
  AssertEqual 'typescriptObjectLabel', SyntaxAt(1, 29)

Given typescriptreact (line comment in tsxTag):
  const foo = () => (
    <div
      // this is a comment
      className="foo"
    >
      Hello World
    </div>
  )
Execute:
    AssertEqual 'tsxLineComment', SyntaxAt(3, 12)

Given typescriptreact (line comment in tsxRegion):
  const foo = () => (
    <div>
      { // this is a comment
      }
      <h1>Hello World</h1>
      { // trailing brace is commented out }
    </div>
  )
Execute:
  AssertEqual 'tsxLineComment', SyntaxAt(3, 10)
  AssertEqual 'tsxLineComment', SyntaxAt(6, 42)

Given typescriptreact (block comment in tsxTag):
  const foo = () => (
    <div
      /*

          this is a comment

      */
      className="foo"
    >
      Hello World
    </div>
  )
Execute:
  AssertEqual 'tsxBlockComment', SyntaxAt(5, 11)

Given typescriptreact (block comment in tsxRegion):
  const foo = () => (
    <div>
      {/* this is a comment */}

      {/*
          this is a comment
      */}
      <h1>Hello World</h1>
    </div>
  )
Execute:
  AssertEqual 'tsxBlockComment', SyntaxAt(3, 9)
  AssertNotEqual 'tsxBlockComment', SyntaxAt(4, 0)
  AssertEqual 'tsxBlockComment', SyntaxAt(6, 9)