/// a ==> bad ==> c ==> d | b --> bad --> e ==> f

// RUN: rm -rf %t && cp -r %S/Inputs/fail-chained/ %t
// RUN: touch -t 201401240005 %t/*

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v 2>&1 | FileCheck -check-prefix=CHECK-FIRST %s
// RUN: FileCheck -check-prefix=CHECK-RECORD-CLEAN %s < %t/main~buildrecord.swiftdeps

// CHECK-FIRST-NOT: warning
// CHECK-FIRST: Handled a.swift
// CHECK-FIRST: Handled b.swift
// CHECK-FIRST: Handled c.swift
// CHECK-FIRST: Handled d.swift
// CHECK-FIRST: Handled e.swift
// CHECK-FIRST: Handled f.swift
// CHECK-FIRST: Handled bad.swift

// CHECK-RECORD-CLEAN-DAG: "./a.swift": [
// CHECK-RECORD-CLEAN-DAG: "./b.swift": [
// CHECK-RECORD-CLEAN-DAG: "./c.swift": [
// CHECK-RECORD-CLEAN-DAG: "./d.swift": [
// CHECK-RECORD-CLEAN-DAG: "./e.swift": [
// CHECK-RECORD-CLEAN-DAG: "./f.swift": [
// CHECK-RECORD-CLEAN-DAG: "./bad.swift": [


// RUN: touch -t 201401240006 %t/a.swift
// RUN: cd %t && not %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies-bad.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/a.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-A %s < %t/a.txt
// RUN: FileCheck -check-prefix=NEGATIVE-A %s < %t/a.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-A %s < %t/main~buildrecord.swiftdeps

// CHECK-A: Handled a.swift
// CHECK-A: Handled bad.swift
// NEGATIVE-A-NOT: Handled b.swift
// NEGATIVE-A-NOT: Handled c.swift
// NEGATIVE-A-NOT: Handled d.swift
// NEGATIVE-A-NOT: Handled e.swift
// NEGATIVE-A-NOT: Handled f.swift

// CHECK-RECORD-A-DAG: "./a.swift": [
// CHECK-RECORD-A-DAG: "./b.swift": [
// CHECK-RECORD-A-DAG: "./c.swift": !dirty [
// CHECK-RECORD-A-DAG: "./d.swift": !dirty [
// CHECK-RECORD-A-DAG: "./e.swift": !private [
// CHECK-RECORD-A-DAG: "./f.swift": [
// CHECK-RECORD-A-DAG: "./bad.swift": !dirty [

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/a2.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-A2 %s < %t/a2.txt
// RUN: FileCheck -check-prefix=NEGATIVE-A2 %s < %t/a2.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-CLEAN %s < %t/main~buildrecord.swiftdeps

// CHECK-A2-DAG: Handled c.swift
// CHECK-A2-DAG: Handled d.swift
// CHECK-A2-DAG: Handled e.swift
// CHECK-A2-DAG: Handled bad.swift
// NEGATIVE-A2-NOT: Handled a.swift
// NEGATIVE-A2-NOT: Handled b.swift
// NEGATIVE-A2-NOT: Handled f.swift


// RUN: rm -rf %t && cp -r %S/Inputs/fail-chained/ %t
// RUN: touch -t 201401240005 %t/*

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v 2>&1 | FileCheck -check-prefix=CHECK-FIRST %s

// RUN: touch -t 201401240006 %t/b.swift
// RUN: cd %t && not %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies-bad.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/b.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-B %s < %t/b.txt
// RUN: FileCheck -check-prefix=NEGATIVE-B %s < %t/b.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-B %s < %t/main~buildrecord.swiftdeps

// CHECK-B: Handled b.swift
// CHECK-B: Handled bad.swift
// NEGATIVE-B-NOT: Handled a.swift
// NEGATIVE-B-NOT: Handled c.swift
// NEGATIVE-B-NOT: Handled d.swift
// NEGATIVE-B-NOT: Handled e.swift
// NEGATIVE-B-NOT: Handled f.swift

// CHECK-RECORD-B-DAG: "./a.swift": [
// CHECK-RECORD-B-DAG: "./b.swift": [
// CHECK-RECORD-B-DAG: "./c.swift": [
// CHECK-RECORD-B-DAG: "./d.swift": [
// CHECK-RECORD-B-DAG: "./e.swift": [
// CHECK-RECORD-B-DAG: "./f.swift": [
// CHECK-RECORD-B-DAG: "./bad.swift": !private [

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/b2.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-B2 %s < %t/b2.txt
// RUN: FileCheck -check-prefix=NEGATIVE-B2 %s < %t/b2.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-CLEAN %s < %t/main~buildrecord.swiftdeps

// CHECK-B2-DAG: Handled bad.swift
// NEGATIVE-B2-NOT: Handled a.swift
// NEGATIVE-B2-NOT: Handled b.swift
// NEGATIVE-B2-NOT: Handled c.swift
// NEGATIVE-B2-NOT: Handled d.swift
// NEGATIVE-B2-NOT: Handled e.swift
// NEGATIVE-B2-NOT: Handled f.swift


// RUN: rm -rf %t && cp -r %S/Inputs/fail-chained/ %t
// RUN: touch -t 201401240005 %t/*

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v 2>&1 | FileCheck -check-prefix=CHECK-FIRST %s

// RUN: touch -t 201401240006 %t/bad.swift
// RUN: cd %t && not %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies-bad.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/bad.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-BAD %s < %t/bad.txt
// RUN: FileCheck -check-prefix=NEGATIVE-BAD %s < %t/bad.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-A %s < %t/main~buildrecord.swiftdeps

// CHECK-BAD: Handled bad.swift
// NEGATIVE-BAD-NOT: Handled a.swift
// NEGATIVE-BAD-NOT: Handled b.swift
// NEGATIVE-BAD-NOT: Handled c.swift
// NEGATIVE-BAD-NOT: Handled d.swift
// NEGATIVE-BAD-NOT: Handled e.swift
// NEGATIVE-BAD-NOT: Handled f.swift

// RUN: cd %t && %swiftc_driver -c -driver-use-frontend-path %S/Inputs/update-dependencies.py -output-file-map %t/output.json -incremental -driver-always-rebuild-dependents ./a.swift ./b.swift ./c.swift ./d.swift ./e.swift ./f.swift ./bad.swift -module-name main -j1 -v > %t/bad2.txt 2>&1
// RUN: FileCheck -check-prefix=CHECK-A2 %s < %t/bad2.txt
// RUN: FileCheck -check-prefix=NEGATIVE-A2 %s < %t/bad2.txt
// RUN: FileCheck -check-prefix=CHECK-RECORD-CLEAN %s < %t/main~buildrecord.swiftdeps
