// 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"
	"testing"
)

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

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

	d := DefineGroup{
		Defines: []*Define{
			{
				Location: clangdoc.Location{99, headerPath},
				Name:     "FOO",
				Value:    "(5)",
				Description: []clangdoc.CommentInfo{
					{
						Kind: "TextComment",
						Text: "This is the documentation for the thing.",
					},
				},
			},
		},
	}

	index := makeEmptyIndex()

	out := bytes.Buffer{}
	writeDefineGroupSection(settings, &index, &d, &out)
	expected :=
		`## FOO macro {:#FOO}

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

<pre class="devsite-disable-click-to-copy">
<span class="kwd">#define</span> <span class="lit">FOO</span> (5)
</pre>

This is the documentation for the thing.

`
	if out.String() != expected {
		t.Errorf("Got: %s\nExpected: %s\n", out.String(), expected)
	}

	// Do one with empty arguments
	d.Defines[0].ParamString = "()"
	out = bytes.Buffer{}
	writeDefineGroupSection(settings, &index, &d, &out)
	expected =
		`## FOO() macro {:#FOO}

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

<pre class="devsite-disable-click-to-copy">
<span class="kwd">#define</span> <span class="lit">FOO</span>() (5)
</pre>

This is the documentation for the thing.

`
	if out.String() != expected {
		t.Errorf("Got: %s\nExpected: %s\n", out.String(), expected)
	}

	// Nonempty arguments (title gets "...").
	d.Defines[0].ParamString = "(a, b)"
	out = bytes.Buffer{}
	writeDefineGroupSection(settings, &index, &d, &out)
	expected =
		`## FOO(…) macro {:#FOO}

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

<pre class="devsite-disable-click-to-copy">
<span class="kwd">#define</span> <span class="lit">FOO</span>(a, b) (5)
</pre>

This is the documentation for the thing.

`
	if out.String() != expected {
		t.Errorf("Got: %s\nExpected: %s\n", out.String(), expected)
	}
}
