// Copyright 2013 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 or at
// https://developers.google.com/open-source/licenses/bsd.

package doc

import (
	"go/ast"
	"testing"
)

var badSynopsis = []string{
	"+build !release",
	"COPYRIGHT Jimmy Bob",
	"### Markdown heading",
	"-*- indent-tabs-mode: nil -*-",
	"vim:set ts=2 sw=2 et ai ft=go:",
}

func TestBadSynopsis(t *testing.T) {
	for _, s := range badSynopsis {
		if synopsis(s) != "" {
			t.Errorf(`synopsis(%q) did not return ""`, s)
		}
	}
}

const readme = `
    $ go get github.com/user/repo/pkg1
    [foo](http://gopkgdoc.appspot.com/pkg/github.com/user/repo/pkg2)
    [foo](http://go.pkgdoc.org/github.com/user/repo/pkg3)
    [foo](http://godoc.org/github.com/user/repo/pkg4)
    <http://go.pkgdoc.org/github.com/user/repo/pkg5>
    [foo](http://godoc.org/github.com/user/repo/pkg6#Export)
    http://gowalker.org/github.com/user/repo/pkg7
    Build Status: [![Build Status](https://drone.io/github.com/user/repo1/status.png)](https://drone.io/github.com/user/repo1/latest)
    'go get example.org/package1' will install package1.
    (http://go.pkgdoc.org/example.org/package2 "Package2's documentation on GoPkgDoc").
    import "example.org/package3"
`

var expectedReferences = []string{
	"github.com/user/repo/pkg1",
	"github.com/user/repo/pkg2",
	"github.com/user/repo/pkg3",
	"github.com/user/repo/pkg4",
	"github.com/user/repo/pkg5",
	"github.com/user/repo/pkg6",
	"github.com/user/repo/pkg7",
	"github.com/user/repo1",
	"example.org/package1",
	"example.org/package2",
	"example.org/package3",
}

func TestReferences(t *testing.T) {
	references := make(map[string]bool)
	addReferences(references, []byte(readme))
	for _, r := range expectedReferences {
		if !references[r] {
			t.Errorf("missing %s", r)
		}
		delete(references, r)
	}
	for r := range references {
		t.Errorf("extra %s", r)
	}
}

var simpleImporterTests = []struct {
	path string
	name string
}{
	// Last element with .suffix removed.
	{"example.com/user/name.git", "name"},
	{"example.com/user/name.svn", "name"},
	{"example.com/user/name.hg", "name"},
	{"example.com/user/name.bzr", "name"},
	{"example.com/name.v0", "name"},
	{"example.com/user/repo/name.v11", "name"},

	// Last element with "go" prefix or suffix removed.
	{"github.com/user/go-name", "name"},
	{"github.com/user/go.name", "name"},
	{"github.com/user/name.go", "name"},
	{"github.com/user/name-go", "name"},

	// Special cases for popular repos.
	{"code.google.com/p/biogo.name", "name"},
	{"code.google.com/p/google-api-go-client/name/v3", "name"},

	// Use last element of path.
	{"example.com/user/name.other", "name.other"},
	{"example.com/.v0", ".v0"},
	{"example.com/user/repo.v2/name", "name"},
	{"github.com/user/namev0", "namev0"},
	{"github.com/user/goname", "goname"},
	{"github.com/user/namego", "namego"},
	{"github.com/user/name", "name"},
	{"name", "name"},
	{"user/name", "name"},
}

func TestSimpleImporter(t *testing.T) {
	for _, tt := range simpleImporterTests {
		m := make(map[string]*ast.Object)
		obj, _ := simpleImporter(m, tt.path)
		if obj.Name != tt.name {
			t.Errorf("simpleImporter(%q) = %q, want %q", tt.path, obj.Name, tt.name)
		}
	}
}