/*
Copyright 2013 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package lint

import (
	"fmt"
	"strings"
	"testing"

	"gwt.googlesource.com/buildglue.git/checkstyle"
	"gwt.googlesource.com/buildglue.git/gerrit"
)

func checkEqual(t *testing.T, expect, actual interface{}) {
	if fmt.Sprintf("%#v", expect) != fmt.Sprintf("%#v", actual) {
		t.Errorf("expect %#v, actual %#v", expect, actual)
	}
}

func TestAddCheckStyleComments(t *testing.T) {
	type testcase struct {
		errors    []checkstyle.Error
		blameable []int
		comments  []gerrit.Comment
	}
	tests := []testcase{
		{
			errors: []checkstyle.Error{
				checkstyle.Error{
					Line:     2,
					Severity: "warning",
					Message:  "Warning on line 2",
				},
			},
			blameable: []int{1, 2, 3},
			comments: []gerrit.Comment{
				gerrit.Comment{
					Line:    2,
					Message: "[warning] Warning on line 2",
				},
			},
		},
		{
			errors: []checkstyle.Error{
				checkstyle.Error{
					Line:     10,
					Severity: "error",
					Message:  "Error far from changed lines",
				},
			},
			blameable: []int{1, 2, 3},
		},
		{
			errors: []checkstyle.Error{
				checkstyle.Error{
					Line:     5,
					Severity: "warning",
					Message:  "Warning near a changed line",
				},
			},
			blameable: []int{1, 2, 3},
			comments: []gerrit.Comment{
				gerrit.Comment{
					Line:    5,
					Message: "[warning] Warning near a changed line",
				},
			},
		},
	}

	for _, test := range tests {
		blameableLines := make(map[int]bool)
		for _, l := range test.blameable {
			blameableLines[l] = true
		}

		linter := newLinter("fakeref")
		linter.addCheckStyleComments(checkstyle.File{Name: "fakefile", Errors: test.errors}, blameableLines)
		checkEqual(t, test.comments, linter.comments["fakefile"])
	}
}

func TestCheckMessage(t *testing.T) {
	type testcase struct {
		message  []string
		warnings []gerrit.Comment
	}
	tests := []testcase{
		{
			message: []string{
				strings.Repeat("x", 60),
				"",
				"Change-Id: blah",
			},
			// No warnings
		},
		{
			message: []string{
				strings.Repeat("x", 90),
				"",
				"Change-Id: blah2",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    1,
					Message: "[warning] Commit message lines should be 72 characters or fewer.",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"No blank line",
				"",
				"Change-Id: blah2",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    2,
					Message: "[warning] Subject line and body should be separated by a blank line.",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"",
				"Fixes issue 3171",
				"",
				"Change-Id: blah2",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    3,
					Message: "[warning] Please use 'Bug: issue NNNN' and place it just above the Change-Id line.",
				},
			},
		},
		{
			message: []string{
				"ISSUE 712 - change some stuff",
				"",
				"Change-Id: blah2",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    1,
					Message: "[warning] Please use 'Bug: issue NNNN' and place it just above the Change-Id line.",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"",
				"bug: issue 88",
				"Change-Id: blah2",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    3,
					Message: "[warning] Footer fields should be in Title-Case.",
				},
			},
		},
		{
			message: []string{
				"Topic: Subject line looking like footer line",
				"",
				"Change-Id: blah",
			},
			// No warnings
		},
		{
			message: []string{
				"Subject line",
				"",
				"Message body",
				"Change-Id: blah",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    3,
					Message: "[warning] Footer lines should be separated from message body by a blank line.",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"",
				"URI in footer should be reported",
				"",
				"http://example.com",
				"Change-Id: blah",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    5,
					Message: "[warning] Footer lines should be separated from message body by a blank line.",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"",
				"Bug: issue 8403",
				"",
				"Change-Id: blah",
			},
			warnings: []gerrit.Comment{
				gerrit.Comment{
					Line:    3,
					Message: "[warning] Footer lines should form a single paragraph (i.e. must not be separated by blank lines.)",
				},
			},
		},
		{
			message: []string{
				"Subject line",
				"",
				"URI in message body shouldn't be seen as a footer",
				"http://example.com",
				"",
				"Change-Id: blah",
			},
			// No warnings
		},
	}

	for _, test := range tests {
		linter := newLinter("fakeref")
		linter.checkMessage(test.message, 0)
		checkEqual(t, test.warnings, linter.comments["/COMMIT_MSG"])
	}
}
