; To keep this test maintainable, avoid depending on -dump-input-context's
; default value, which is checked in dump-input-context.txt instead.

;--------------------------------------------------
; Create the input file and the check file.
;--------------------------------------------------

; line 1
; RUN: echo start >  %t.in
; RUN: echo foo0  >> %t.in
; RUN: echo foo1  >> %t.in
; RUN: echo foo2  >> %t.in
; RUN: echo foo3  >> %t.in
; RUN: echo foo4  >> %t.in
; RUN: echo foo5  >> %t.in
; RUN: echo foo6  >> %t.in
; RUN: echo foo7  >> %t.in
; RUN: echo foo8  >> %t.in
; RUN: echo foo9  >> %t.in
; line 12
; RUN: echo hello >> %t.in
; RUN: echo foo0  >> %t.in
; RUN: echo foo1  >> %t.in
; RUN: echo foo2  >> %t.in
; RUN: echo foo3  >> %t.in
; RUN: echo foo4  >> %t.in
; RUN: echo foo5  >> %t.in
; RUN: echo foo6  >> %t.in
; RUN: echo foo7  >> %t.in
; RUN: echo foo8  >> %t.in
; RUN: echo foo9  >> %t.in
; line 23
; RUN: echo word  >> %t.in
; RUN: echo foo0  >> %t.in
; RUN: echo foo1  >> %t.in
; RUN: echo foo2  >> %t.in
; RUN: echo foo3  >> %t.in
; RUN: echo foo4  >> %t.in
; RUN: echo foo5  >> %t.in
; RUN: echo foo6  >> %t.in
; RUN: echo foo7  >> %t.in
; RUN: echo foo8  >> %t.in
; RUN: echo foo9  >> %t.in
; line 34
; RUN: echo end   >> %t.in

; RUN: echo 'CHECK: start' >  %t.chk
; RUN: echo 'CHECK: hello' >> %t.chk
; RUN: echo 'CHECK: world' >> %t.chk
; RUN: echo 'CHECK: end'   >> %t.chk

;--------------------------------------------------
; Directives for checking the dump.
;--------------------------------------------------

;      ALL: <<<<<<
; ALL-NEXT:            1: start 
; ALL-NEXT: check:1       ^~~~~
; ALL-NEXT:            2: foo0 
; ALL-NEXT:            3: foo1 
; ALL-NEXT:            4: foo2 
; ALL-NEXT:            5: foo3 
; ALL-NEXT:            6: foo4 
; ALL-NEXT:            7: foo5 
; ALL-NEXT:            8: foo6 
; ALL-NEXT:            9: foo7 
; ALL-NEXT:           10: foo8 
; ALL-NEXT:           11: foo9 
; ALL-NEXT:           12: hello 
; ALL-NEXT: check:2       ^~~~~
; ALL-NEXT: check:3'0          X error: no match found
; ALL-NEXT:           13: foo0 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           14: foo1 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           15: foo2 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           16: foo3 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           17: foo4 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           18: foo5 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           19: foo6 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           20: foo7 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           21: foo8 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           22: foo9 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           23: word 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT: check:3'1     ?     possible intended match
; ALL-NEXT:           24: foo0 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           25: foo1 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           26: foo2 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           27: foo3 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           28: foo4 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           29: foo5 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           30: foo6 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           31: foo7 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           32: foo8 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           33: foo9 
; ALL-NEXT: check:3'0     ~~~~~
; ALL-NEXT:           34: end 
; ALL-NEXT: check:3'0     ~~~~
; ALL-NEXT: >>>>>>

;      ANNOTATION-FULL: <<<<<<
; ANNOTATION-FULL-NEXT:            1: start 
; ANNOTATION-FULL-NEXT: check:1       ^~~~~
; ANNOTATION-FULL-NEXT:            2: foo0 
; ANNOTATION-FULL-NEXT:            3: foo1 
; ANNOTATION-FULL-NEXT:            .
; ANNOTATION-FULL-NEXT:            .
; ANNOTATION-FULL-NEXT:            .
; ANNOTATION-FULL-NEXT:           10: foo8 
; ANNOTATION-FULL-NEXT:           11: foo9 
; ANNOTATION-FULL-NEXT:           12: hello 
; ANNOTATION-FULL-NEXT: check:2       ^~~~~
; ANNOTATION-FULL-NEXT: check:3'0          X error: no match found
; ANNOTATION-FULL-NEXT:           13: foo0 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           14: foo1 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           15: foo2 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           16: foo3 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           17: foo4 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           18: foo5 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           19: foo6 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           20: foo7 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           21: foo8 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           22: foo9 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           23: word 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT: check:3'1     ?     possible intended match
; ANNOTATION-FULL-NEXT:           24: foo0 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           25: foo1 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           26: foo2 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           27: foo3 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           28: foo4 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           29: foo5 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           30: foo6 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           31: foo7 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           32: foo8 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           33: foo9 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~~
; ANNOTATION-FULL-NEXT:           34: end 
; ANNOTATION-FULL-NEXT: check:3'0     ~~~~
; ANNOTATION-FULL-NEXT: >>>>>>

;      ANNOTATION: <<<<<<
; ANNOTATION-NEXT:            1: start 
; ANNOTATION-NEXT: check:1       ^~~~~
; ANNOTATION-NEXT:            2: foo0 
; ANNOTATION-NEXT:            3: foo1 
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:           10: foo8 
; ANNOTATION-NEXT:           11: foo9 
; ANNOTATION-NEXT:           12: hello 
; ANNOTATION-NEXT: check:2       ^~~~~
; ANNOTATION-NEXT: check:3'0          X error: no match found
; ANNOTATION-NEXT:           13: foo0 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:           14: foo1 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:           21: foo8 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:           22: foo9 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:           23: word 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT: check:3'1     ?     possible intended match
; ANNOTATION-NEXT:           24: foo0 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:           25: foo1 
; ANNOTATION-NEXT: check:3'0     ~~~~~
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT:            .
; ANNOTATION-NEXT: >>>>>>

;      ERROR: <<<<<<
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT:           10: foo8 
; ERROR-NEXT:           11: foo9 
; ERROR-NEXT:           12: hello 
; ERROR-NEXT: check:2       ^~~~~
; ERROR-NEXT: check:3'0          X error: no match found
; ERROR-NEXT:           13: foo0 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:           14: foo1 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT:           21: foo8 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:           22: foo9 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:           23: word 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT: check:3'1     ?     possible intended match
; ERROR-NEXT:           24: foo0 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:           25: foo1 
; ERROR-NEXT: check:3'0     ~~~~~
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT:            .
; ERROR-NEXT: >>>>>>

;--------------------------------------------------
; Check -dump-input-filter=<bad value>.
;--------------------------------------------------

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=foobar \
; RUN: | FileCheck %s -match-full-lines -check-prefix=BADVAL

BADVAL: {{F|f}}ile{{C|c}}heck{{.*}}: for the --dump-input-filter option: Cannot find option named 'foobar'!

;--------------------------------------------------
; Check -dump-input-filter explicit values.
;--------------------------------------------------

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=all \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ALL

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=annotation-full \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION-FULL

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=annotation \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=error \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ERROR

;--------------------------------------------------
; Check -dump-input-filter defaults.
;--------------------------------------------------

; no -dump-input => -dump-input-filter=error
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ERROR

; -dump-input=fail => -dump-input-filter=error
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input=fail \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ERROR

; -dump-input=always => -dump-input-filter=all
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input=always \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ALL

;--------------------------------------------------
; Check multiple -dump-input-filter options.
;
; This might occur when a test author specifies -dump-input-filter on a specific
; FileCheck call while a test runner specifies -dump-input-filter in
; FILECHECK_OPTS, but check the behavior generally.
;
; The value providing the most information wins.
;--------------------------------------------------

;- - - - - - - - - - - - - - - - - - - - - - - - -
; Check duplicate.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; all, all => all
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=all -dump-input-filter=all \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ALL

;- - - - - - - - - - - - - - - - - - - - - - - - -
; Check precedence.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; all, annotation-full => all
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=all -dump-input-filter=annotation-full \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ALL

; annotation-full, annotation => annotation-full
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=annotation-full \
; RUN:               -dump-input-filter=annotation \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION-FULL

; annotation, error => annotation
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=annotation -dump-input-filter=error \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION

;- - - - - - - - - - - - - - - - - - - - - - - - -
; Check that order doesn't matter.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; error, annotation => annotation
; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=error -dump-input-filter=annotation \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION

;- - - - - - - - - - - - - - - - - - - - - - - - -
; Check that FILECHECK_OPTS isn't handled differently.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; annotation, error => annotation
; RUN: %ProtectFileCheckOutput FILECHECK_OPTS=-dump-input-filter=annotation \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=error \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION

; error, annotation => annotation
; RUN: %ProtectFileCheckOutput FILECHECK_OPTS=-dump-input-filter=error \
; RUN: not FileCheck -dump-input-context=2 -vv %t.chk < %t.in 2>&1 \
; RUN:               -dump-input-filter=annotation \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=ANNOTATION

;--------------------------------------------------
; Check the case where all input lines are filtered out.
;--------------------------------------------------

; RUN: echo 'CHECK: hello' > %t.good.chk

; RUN: %ProtectFileCheckOutput \
; RUN: FileCheck -dump-input=always -dump-input-filter=error -vv %t.good.chk \
; RUN:           < %t.in 2>&1 \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=EMPTY

;      EMPTY: <<<<<<
; EMPTY-NEXT:          .
; EMPTY-NEXT:          .
; EMPTY-NEXT:          .
; EMPTY-NEXT: >>>>>>

;--------------------------------------------------
; Check that other kinds of errors are included by -dump-input-filter=error.
;
; "error: no match found" and "possible intended match" are checked above.
;--------------------------------------------------

;- - - - - - - - - - - - - - - - - - - - - - - - -
; error: no match expected.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; RUN: echo 'foo'            > %t.not-err.in
; RUN: echo 'CHECK-NOT: foo' > %t.not-err.chk

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=0 -dump-input-filter=error \
; RUN:               %t.not-err.chk < %t.not-err.in 2>&1 \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOT-ERR

;      NOT-ERR:        1: foo 
; NOT-ERR-NEXT: not:1     !~~ error: no match expected

;- - - - - - - - - - - - - - - - - - - - - - - - -
; error: match on wrong line.
;- - - - - - - - - - - - - - - - - - - - - - - - -

; RUN: echo 'foo'             >  %t.next-err.in
; RUN: echo 'foo'             >> %t.next-err.in
; RUN: echo 'bar'             >> %t.next-err.in
; RUN: echo 'CHECK: foo'      >  %t.next-err.chk
; RUN: echo 'CHECK-NEXT: bar' >> %t.next-err.chk

; RUN: %ProtectFileCheckOutput \
; RUN: not FileCheck -dump-input-context=0 -dump-input-filter=error \
; RUN:               %t.next-err.chk < %t.next-err.in 2>&1 \
; RUN: | FileCheck %s -match-full-lines -check-prefixes=NEXT-ERR

;      NEXT-ERR:         3: bar 
; NEXT-ERR-NEXT: next:2     !~~ error: match on wrong line
