// Copyright 2015 The Vanadium 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 cmdline

import (
	"bytes"
	"io"
	"os"
	"testing"
)

func writeFunc(s string) func(io.Writer) {
	return func(w io.Writer) { w.Write([]byte(s)) }
}

func TestEnvUsageErrorf(t *testing.T) {
	tests := []struct {
		format string
		args   []interface{}
		usage  func(io.Writer)
		want   string
	}{
		{"", nil, nil, "ERROR: \n\nusage error\n"},
		{"", nil, writeFunc("FooBar"), "ERROR: \n\nFooBar"},
		{"", nil, writeFunc("FooBar\n"), "ERROR: \n\nFooBar\n"},
		{"A%vB", []interface{}{"x"}, nil, "ERROR: AxB\n\nusage error\n"},
		{"A%vB", []interface{}{"x"}, writeFunc("FooBar"), "ERROR: AxB\n\nFooBar"},
		{"A%vB", []interface{}{"x"}, writeFunc("FooBar\n"), "ERROR: AxB\n\nFooBar\n"},
	}
	for _, test := range tests {
		var buf bytes.Buffer
		env := &Env{Stderr: &buf, Usage: test.usage}
		if got, want := env.UsageErrorf(test.format, test.args...), ErrUsage; got != want {
			t.Errorf("%q got error %v, want %v", test.want, got, want)
		}
		if got, want := buf.String(), test.want; got != want {
			t.Errorf("got %v, want %v", got, want)
		}
	}
}

func TestEnvWidth(t *testing.T) {
	tests := []struct {
		value string
		want  int
	}{
		{"123", 123},
		{"-1", -1},
		{"0", defaultWidth},
		{"", defaultWidth},
		{"foobar", defaultWidth},
	}
	for _, test := range tests {
		// Test using a fake environment.
		env := &Env{Vars: map[string]string{"CMDLINE_WIDTH": test.value}}
		if got, want := env.width(), test.want; got != want {
			t.Errorf("%q got %v, want %v", test.value, got, want)
		}
		// Test using the OS environment.
		if err := os.Setenv("CMDLINE_WIDTH", test.value); err != nil {
			t.Errorf("Setenv(%q) failed: %v", test.value, err)
		} else if got, want := NewEnv().width(), test.want; got != want {
			t.Errorf("%q got %v, want %v", test.value, got, want)
		}
	}
	os.Unsetenv("CMDLINE_WIDTH")
}

func TestEnvStyle(t *testing.T) {
	tests := []struct {
		value string
		want  style
	}{
		{"compact", styleCompact},
		{"full", styleFull},
		{"godoc", styleGoDoc},
		{"", styleCompact},
		{"abc", styleCompact},
		{"foobar", styleCompact},
	}
	for _, test := range tests {
		// Test using a fake environment.
		env := &Env{Vars: map[string]string{"CMDLINE_STYLE": test.value}}
		if got, want := env.style(), test.want; got != want {
			t.Errorf("%q got %v, want %v", test.value, got, want)
		}
		// Test using the OS environment.
		if err := os.Setenv("CMDLINE_STYLE", test.value); err != nil {
			t.Errorf("Setenv(%q) failed: %v", test.value, err)
		} else if got, want := NewEnv().style(), test.want; got != want {
			t.Errorf("%q got %v, want %v", test.value, got, want)
		}
	}
	os.Unsetenv("CMDLINE_STYLE")
}
