// 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 (
	"golang.org/x/website/internal/backport/go/token"
	"os"
	"runtime"
	"sort"
	"testing"
	"testing/fstest"
)

func TestNewDirTree(t *testing.T) {
	d := newDir(os.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 := os.DirFS(runtime.GOROOT())

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