// Copyright 2020 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 postgres

import (
	"testing"

	"github.com/google/go-cmp/cmp"
)

func TestSearchDocumentSections(t *testing.T) {
	for _, test := range []struct {
		name                string
		synopsis            string
		readmeFilename      string
		readmeContents      string
		wantB, wantC, wantD string
	}{
		{
			"blackfriday",
			"This is a synopsis.",
			"foo.md",
			`Package blackfriday is a [markdown](http://foo) processor. That _is_ all that it is.`,

			"this is a synopsis",
			"package blackfriday is a markdown processor",
			"that is all",
		},
		{
			"non-markdown",
			"This synopsis is too long so we'll truncate it.",
			"README",
			"This README doesn't have a sentence end so the whole thing is D",

			"this synopsis is too long so",
			"",
			"this readme doesn't have a sentence",
		},
		{
			"viper",
			"",
			"README.md",
			`
![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png)

Go configuration with fangs!

[![Actions](https://github.com/spf13/viper/workflows/CI/badge.svg)](https://github.com/spf13/viper)
[![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper)

Many Go projects are built using Viper including:`,

			"go configuration with fangs", // first sentence of README promoted
			"",
			"many go projects are",
		},
	} {
		gotB, gotC, gotD := searchDocumentSections(test.synopsis, test.readmeFilename, test.readmeContents, 6, 0.5)
		if gotB != test.wantB {
			t.Errorf("%s, B: got %q, want %q", test.name, gotB, test.wantB)
		}
		if gotC != test.wantC {
			t.Errorf("%s, C: got %q, want %q", test.name, gotC, test.wantC)
		}
		if gotD != test.wantD {
			t.Errorf("%s, D: got %q, want %q", test.name, gotD, test.wantD)
		}
	}
}

func TestProcessWords(t *testing.T) {
	for _, test := range []struct {
		in   string
		want []string
	}{
		{"", nil},
		{"foo", []string{"foo"}},
		{" foo \t bar\n", []string{"foo", "bar"}},
		{"http://foo/bar/baz?x=1", []string{"http://foo/bar/baz?x=1"}},
		{"This, however, shall. not; stand?", []string{"this", "however", "shall", "not", "stand"}},
		{"a postgres and NATS server over HTTP", []string{
			"a", "postgres", "postgresql", "and", "nats", "server", "over", "http"}},
		{"http://a-b-c.com full-text chart-parser", []string{
			"http://a-b-c.com", "full-text", "chart-parser", "parser", "parse"}},
	} {
		got := processWords(test.in)
		if !cmp.Equal(got, test.want) {
			t.Errorf("%q:\ngot  %#v\nwant %#v", test.in, got, test.want)
		}
	}
}

func TestProcessMarkdown(t *testing.T) {
	const (
		in = `
Blackfriday [![Build Status](https://travis-ci.org/russross/blackfriday.svg?branch=master)](https://travis-ci.org/russross/blackfriday)
===========

_Blackfriday_ is a [Markdown][1] *processor* implemented in [Go](https://golang.org).

[1]: https://daringfireball.net/projects/markdown/ "Markdown"
`

		want = `Blackfriday  Blackfriday is a Markdown processor implemented in Go.`
	)

	got := processMarkdown(in)
	if got != want {
		t.Errorf("got\n%s\nwant\n%s", got, want)
	}
}

func TestSentenceEndIndex(t *testing.T) {
	for _, test := range []struct {
		in   string
		want int
	}{
		{"", -1},
		{"Hello. What's up?", 5},
		{"unicode π∆!", 13},
		{"D. C. Fontana?", 13},
		{"D. c. Fontana?", 4},
		{"no end", -1},
	} {
		got := sentenceEndIndex(test.in)
		if got != test.want {
			t.Errorf("%s: got %d, want %d", test.in, got, test.want)
		}
	}
}
