// Copyright 2022 The Fuchsia 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 docgen

import (
	"bytes"
	"go.fuchsia.dev/fuchsia/tools/cppdocgen/clangdoc"
	"strings"
	"testing"
)

func TestWriteHeaderReference(t *testing.T) {
	settings := WriteSettings{
		LibName:            "libtest",
		BuildRelSourceRoot: "../..",
		BuildRelIncludeDir: "../../src",
		RepoBaseUrl:        "http://example.com/main/"}

	index := makeEmptyIndex()

	// Our header name should end up as "lib/test/myheader.h"
	headerPath := "../../src/lib/test/myheader.h"

	// Define a function.
	fn := &clangdoc.FunctionInfo{
		Name:       "MyFunction",
		USR:        "SomeUSR",
		ReturnType: clangdoc.MakeGlobalType("void")}
	index.FunctionUsrs[fn.USR] = fn
	index.FunctionNames[fn.Name] = fn

	// Define a class.
	rec := &clangdoc.RecordInfo{
		Name:        "MyClass",
		Path:        "",
		TagType:     "Class",
		DefLocation: clangdoc.Location{99, headerPath}}
	index.RecordUsrs["USR_FOR_RECORD"] = rec

	header := &Header{Name: headerPath,
		Functions: []*clangdoc.FunctionInfo{fn},
		FunctionGroups: []*FunctionGroup{
			{Funcs: []*clangdoc.FunctionInfo{fn}},
		},
		Records: []*clangdoc.RecordInfo{rec}}
	index.Headers[headerPath] = header

	out := bytes.Buffer{}
	WriteHeaderReference(settings, &index, header, &out)

	headerExpected := `# \<lib/test/myheader.h\> in libtest

[Header source code](http://example.com/main/src/lib/test/myheader.h)

## MyClass class {:#}

[Declaration source code](http://example.com/main/src/lib/test/myheader.h#99)

<pre class="devsite-disable-click-to-copy">
<span class="kwd">class</span> MyClass { <span class="com">...</span> };
</pre>

## MyFunction() {:#MyFunction}

<pre class="devsite-disable-click-to-copy">
<span class="typ">void</span> <b>MyFunction</b>();
</pre>`
	headerGot := strings.TrimSpace(out.String())
	if headerGot != headerExpected {
		t.Errorf("Got:\n%s\n\nExpected:\n%s\n", headerGot, headerExpected)
	}
}

func TestWriteHeaderComment(t *testing.T) {
	settings := WriteSettings{
		LibName:            "libtest",
		BuildRelSourceRoot: "../..",
		BuildRelIncludeDir: "../../src",
		RepoBaseUrl:        "http://example.com/main/"}

	index := makeEmptyIndex()

	// Our header name should end up as "lib/test/myheader.h"
	headerPath := "../../src/lib/test/myheader.h"

	// This header has a header comment but no custom title.
	header := &Header{
		Name: headerPath,
		Description: []clangdoc.CommentInfo{
			{Kind: "TextComment",
				Text: " First line text",
			},
			{Kind: "TextComment",
				Text: "",
			},
			{Kind: "TextComment",
				Text: " Contents text",
			},
		},
		Functions: []*clangdoc.FunctionInfo{},
		Records:   []*clangdoc.RecordInfo{}}
	index.Headers[headerPath] = header

	out := bytes.Buffer{}
	WriteHeaderReference(settings, &index, header, &out)

	headerExpected := `# \<lib/test/myheader.h\> in libtest

[Header source code](http://example.com/main/src/lib/test/myheader.h)

First line text

Contents text`
	headerGot := strings.TrimSpace(out.String())
	if headerGot != headerExpected {
		t.Errorf("Got:\n%s\n\nExpected:\n%s\n", headerGot, headerExpected)
	}

	// Set a custom title in the header comment.
	header.Description[0].Text = " # My custom title"
	out = bytes.Buffer{}
	WriteHeaderReference(settings, &index, header, &out)

	headerExpected = `# My custom title

[Header source code](http://example.com/main/src/lib/test/myheader.h)


Contents text`
	headerGot = strings.TrimSpace(out.String())
	if headerGot != headerExpected {
		t.Errorf("Got:\n%s\n\nExpected:\n%s\n", headerGot, headerExpected)
	}
}
