# Test go mod tidy -diff
# If set, -diff should not update go.mod or go.sum and instead return a non-zero exit code if updates are needed.

# Missing go.mod and go.sum should fail and not display diff.
! exists go.mod
! exists go.sum
! go mod tidy -diff
! exists go.mod
! exists go.sum
! stdout 'diff current/go.mod tidy/go.mod'
! stdout 'diff current/go.sum tidy/go.sum'
stderr 'go.mod file not found'

# Missing go.mod and existing go.sum should fail and not display diff.
cp go.sum.orig go.sum
! exists go.mod
exists go.sum
! go mod tidy -diff
! exists go.mod
! stdout 'diff current/go.mod tidy/go.mod'
! stdout 'diff current/go.sum tidy/go.sum'
stderr 'go.mod file not found'

# Existing go.mod and missing go.sum should display diff.
go mod init example.com
go mod tidy
rm go.sum
exists go.mod
! exists go.sum
! go mod tidy -diff
! exists go.sum
! stdout 'diff current/go.mod tidy/go.mod'
stdout 'diff current/go.sum tidy/go.sum'

# Everything is tidy, should return zero exit code.
go mod tidy
go mod tidy -diff
! stdout 'diff current/go.mod tidy/go.mod'
! stdout 'diff current/go.sum tidy/go.sum'

# go.mod requires updates, should return non-zero exit code.
cp go.mod.orig go.mod
! go mod tidy -diff
stdout 'diff current/go.mod tidy/go.mod'
! stdout 'diff current/go.sum tidy/go.sum'
cmp go.mod.orig go.mod

# go.sum requires updates, should return non-zero exit code.
go mod tidy
cp go.sum.orig go.sum
! go mod tidy -diff
! stdout 'diff current/go.mod tidy/go.mod'
stdout 'diff current/go.sum tidy/go.sum'
cmp go.sum.orig go.sum

# go.mod and go.sum require updates, should return non-zero exit code.
cp go.mod.orig go.mod
cp go.sum.orig go.sum
! go mod tidy -diff
stdout 'diff current/go.mod tidy/go.mod'
stdout 'diff current/go.sum tidy/go.sum'
cmp go.mod.orig go.mod
cmp go.sum.orig go.sum

# Save the result from running tidy.
[exec:patch] cp go.mod.orig go.mod
[exec:patch] cp go.sum.orig go.sum
[exec:patch] go mod tidy
[exec:patch] cp go.mod go.mod.tidyResult
[exec:patch] cp go.sum go.sum.tidyResult

# Compare output of -diff to running tidy.
# Apply the patch from -diff
[exec:patch] cp go.mod.orig go.mod
[exec:patch] cp go.sum.orig go.sum
[exec:patch] ! go mod tidy -diff
[exec:patch] cp stdout diff.patch
[exec:patch] exec patch -p1 -i diff.patch
[exec:patch] go mod tidy -diff
[exec:patch] ! stdout .
[exec:patch] cmp go.mod go.mod.tidyResult
[exec:patch] cmp go.sum go.sum.tidyResult


-- main.go --
package main

import "rsc.io/quote"

func main() {
	println(quote.Hello())
}

-- go.mod.orig --
module example.com

go 1.22
-- go.sum.orig --
rsc.io/quote v1.5.2 h1:3fEykkD9k7lYzXqCYrwGAf7iNhbk4yCjHmKBN9td4L0=