// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package pkgdoc

import (
	"go/token"
	"runtime"
	"sort"
	"testing"

	"golang.org/x/website/internal/backport/osfs"
	"golang.org/x/website/internal/backport/testing/fstest"
)

func TestNewDirTree(t *testing.T) {
	dir := newDir(osfs.DirFS(runtime.GOROOT()), token.NewFileSet(), "src")
	processDir(t, dir)
}

func processDir(t *testing.T, dir *Dir) {
	var list []string
	for _, d := range dir.Dirs {
		list = append(list, d.Name())
		// recursively process the lower level
		processDir(t, d)
	}

	if sort.StringsAreSorted(list) == false {
		t.Errorf("list: %v is not sorted\n", list)
	}
}

func TestIssue45614(t *testing.T) {
	fs := fstest.MapFS{
		"src/index/suffixarray/gen.go": {
			Data: []byte(`// P1: directory contains a main package
package main
`)},
		"src/index/suffixarray/suffixarray.go": {
			Data: []byte(`// P0: directory name matches package name
package suffixarray
`)},
	}

	dir := newDir(fs, token.NewFileSet(), "src/index/suffixarray")
	if got, want := dir.Synopsis, "P0: directory name matches package name"; got != want {
		t.Errorf("dir.Synopsis = %q; want %q", got, want)
	}
}

func BenchmarkNewDirectory(b *testing.B) {
	if testing.Short() {
		b.Skip("not running tests requiring large file scan in short mode")
	}

	fs := osfs.DirFS(runtime.GOROOT())

	b.ResetTimer()
	b.ReportAllocs()
	for tries := 0; tries < b.N; tries++ {
		newDir(fs, token.NewFileSet(), "src")
	}
}
