// Copyright 2013 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 godoc

import (
	"errors"
	"expvar"
	"net/http"
	"net/http/httptest"
	"testing"
	"text/template"
)

var (
	// NOTE: with no plain-text in the template, template.Execute will not
	// return an error when http.ResponseWriter.Write does return an error.
	tmpl = template.Must(template.New("test").Parse("{{.Foo}}"))
)

type withFoo struct {
	Foo int
}

type withoutFoo struct {
}

type errResponseWriter struct {
}

func (*errResponseWriter) Header() http.Header {
	return http.Header{}
}

func (*errResponseWriter) WriteHeader(int) {
}

func (*errResponseWriter) Write(p []byte) (int, error) {
	return 0, errors.New("error")
}

func TestApplyTemplateToResponseWriter(t *testing.T) {
	for _, tc := range []struct {
		desc    string
		rw      http.ResponseWriter
		data    interface{}
		expVars int
	}{
		{
			desc:    "no error",
			rw:      &httptest.ResponseRecorder{},
			data:    &withFoo{},
			expVars: 0,
		},
		{
			desc:    "template error",
			rw:      &httptest.ResponseRecorder{},
			data:    &withoutFoo{},
			expVars: 0,
		},
		{
			desc:    "ResponseWriter error",
			rw:      &errResponseWriter{},
			data:    &withFoo{},
			expVars: 1,
		},
	} {
		httpErrors.Init()
		applyTemplateToResponseWriter(tc.rw, tmpl, tc.data)
		gotVars := 0
		httpErrors.Do(func(expvar.KeyValue) {
			gotVars++
		})
		if gotVars != tc.expVars {
			t.Errorf("applyTemplateToResponseWriter(%q): got %d vars, want %d", tc.desc, gotVars, tc.expVars)
		}
	}
}
