package lint

import (
	"context"
	"testing"

	"github.com/golangci/golangci-lint/pkg/config"
	"github.com/golangci/golangci-lint/pkg/lint/astcache"
	"github.com/golangci/golangci-lint/pkg/lint/linter"
	"github.com/golangci/golangci-lint/pkg/packages"
	"github.com/stretchr/testify/assert"
)

func TestASTCacheLoading(t *testing.T) {
	ctx := context.Background()
	linters := []linter.Config{
		linter.NewConfig(nil).WithFullImport(),
	}

	inputPaths := []string{"./...", "./", "./load.go", "load.go"}
	for _, inputPath := range inputPaths {
		r, err := packages.NewResolver(nil, nil)
		assert.NoError(t, err)

		pkgProg, err := r.Resolve(inputPath)
		assert.NoError(t, err)

		assert.NoError(t, err)
		assert.NotEmpty(t, pkgProg.Files(true))

		prog, _, err := loadWholeAppIfNeeded(ctx, linters, &config.Run{
			AnalyzeTests: true,
		}, pkgProg)
		assert.NoError(t, err)

		astCacheFromProg, err := astcache.LoadFromProgram(prog)
		assert.NoError(t, err)

		astCacheFromFiles, err := astcache.LoadFromFiles(pkgProg.Files(true))
		assert.NoError(t, err)

		filesFromProg := astCacheFromProg.GetAllValidFiles()
		filesFromFiles := astCacheFromFiles.GetAllValidFiles()
		if len(filesFromProg) != len(filesFromFiles) {
			t.Logf("files: %s", pkgProg.Files(true))
			t.Logf("from prog:")
			for _, f := range filesFromProg {
				t.Logf("%+v", *f)
			}
			t.Logf("from files:")
			for _, f := range filesFromFiles {
				t.Logf("%+v", *f)
			}
			t.Fatalf("lengths differ")
		}

		if len(filesFromProg) != len(pkgProg.Files(true)) {
			t.Fatalf("filesFromProg differ from path.Files")
		}
	}
}