/*
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},
		},
	}

	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",
				"",
				"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.)",
				},
			},
		},
	}

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