// 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) {
	d := newDir(osfs.DirFS(runtime.GOROOT()), token.NewFileSet(), "src")
	processDir(t, d)
}

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

	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
`)},
	}

	d := newDir(fs, token.NewFileSet(), "src/index/suffixarray")
	if got, want := d.Synopsis, "P0: directory name matches package name"; got != want {
		t.Errorf("d.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")
	}
}
