overview: |
  Comment tags represent content that should never appear in the resulting
  output.

  The tag's content may contain any substring (including newlines) EXCEPT the
  closing delimiter.

  Comment tags SHOULD be treated as standalone when appropriate.
tests:
  - name: Inline
    desc: Comment blocks should be removed from the template.
    data: { }
    template: '12345{{! Comment Block! }}67890'
    expected: '1234567890'

  - name: Multiline
    desc: Multiline comments should be permitted.
    data: { }
    template: |
      12345{{!
        This is a
        multi-line comment...
      }}67890
    expected: |
      1234567890

  - name: Standalone
    desc: All standalone comment lines should be removed.
    data: { }
    template: |
      Begin.
      {{! Comment Block! }}
      End.
    expected: |
      Begin.
      End.

  - name: Indented Standalone
    desc: All standalone comment lines should be removed.
    data: { }
    template: |
      Begin.
        {{! Indented Comment Block! }}
      End.
    expected: |
      Begin.
      End.

  - name: Standalone Line Endings
    desc: '"\r\n" should be considered a newline for standalone tags.'
    data: { }
    template: "|\r\n{{! Standalone Comment }}\r\n|"
    expected: "|\r\n|"

  - name: Standalone Without Previous Line
    desc: Standalone tags should not require a newline to precede them.
    data: { }
    template: "  {{! I'm Still Standalone }}\n!"
    expected: "!"

  - name: Standalone Without Newline
    desc: Standalone tags should not require a newline to follow them.
    data: { }
    template: "!\n  {{! I'm Still Standalone }}"
    expected: "!\n"

  - name: Multiline Standalone
    desc: All standalone comment lines should be removed.
    data: { }
    template: |
      Begin.
      {{!
      Something's going on here...
      }}
      End.
    expected: |
      Begin.
      End.

  - name: Indented Multiline Standalone
    desc: All standalone comment lines should be removed.
    data: { }
    template: |
      Begin.
        {{!
          Something's going on here...
        }}
      End.
    expected: |
      Begin.
      End.

  - name: Indented Inline
    desc: Inline comments should not strip whitespace
    data: { }
    template: "  12 {{! 34 }}\n"
    expected: "  12 \n"

  - name: Surrounding Whitespace
    desc: Comment removal should preserve surrounding whitespace.
    data: { }
    template: '12345 {{! Comment Block! }} 67890'
    expected: '12345  67890'
