// 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 v23cmd

import (
	"bytes"
	"fmt"
	"testing"

	"v.io/v23"
	"v.io/v23/context"
	"v.io/x/lib/cmdline"
	_ "v.io/x/ref/runtime/factories/generic"
	"v.io/x/ref/test"
)

var cmdRoot = &cmdline.Command{
	Name:     "root",
	Short:    "root",
	Long:     "root",
	Children: []*cmdline.Command{cmdNoV23, cmdNoInit, cmdWithInit},
}

var cmdNoV23 = &cmdline.Command{
	Name:   "no_v23",
	Short:  "no_v23",
	Long:   "no_v23",
	Runner: cmdline.RunnerFunc(runNoV23),
}

var cmdNoInit = &cmdline.Command{
	Name:   "no_init",
	Short:  "no_init",
	Long:   "no_init",
	Runner: RunnerFunc(runNoInit),
}

var cmdWithInit = &cmdline.Command{
	Name:   "with_init",
	Short:  "with_init",
	Long:   "with_init",
	Runner: RunnerFuncWithInit(runWithInit, initFunc),
}

func runNoV23(env *cmdline.Env, args []string) error {
	fmt.Fprintf(env.Stdout, "NoV23")
	return nil
}

func runNoInit(ctx *context.T, env *cmdline.Env, args []string) error {
	fmt.Fprintf(env.Stdout, "NoInit %v %v", ctx.Value(initKey), ctx.Value(forTestKey))
	return nil
}

func runWithInit(ctx *context.T, env *cmdline.Env, args []string) error {
	fmt.Fprintf(env.Stdout, "WithInit %v %v", ctx.Value(initKey), ctx.Value(forTestKey))
	return nil
}

const (
	initKey      = "init key"
	initValue    = "<init value>"
	forTestKey   = "for test key"
	forTestValue = "<for test value>"
)

func initFunc() (*context.T, v23.Shutdown, error) {
	ctx, shutdown, err := v23.TryInit()
	return context.WithValue(ctx, initKey, initValue), shutdown, err
}

func TestParseAndRun(t *testing.T) {
	tests := []struct {
		cmd    string
		stdout string
	}{
		{"no_v23", "NoV23"},
		{"no_init", "NoInit <nil> <nil>"},
		{"with_init", "WithInit <init value> <nil>"},
	}
	for _, test := range tests {
		var stdout bytes.Buffer
		env := &cmdline.Env{Stdout: &stdout}
		if err := cmdline.ParseAndRun(cmdRoot, env, []string{test.cmd}); err != nil {
			t.Errorf("ParseAndRun failed: %v", err)
		}
		if got, want := stdout.String(), test.stdout; got != want {
			t.Errorf("got stdout %q, want %q", got, want)
		}
	}
}

func TestParseAndRunForTest(t *testing.T) {
	tests := []struct {
		cmd    string
		stdout string
	}{
		{"no_v23", "NoV23"},
		{"no_init", "NoInit <nil> <for test value>"},
		{"with_init", "WithInit <nil> <for test value>"},
	}
	for _, tc := range tests {
		ctx, shutdown := test.V23Init()
		ctx = context.WithValue(ctx, forTestKey, forTestValue)

		var stdout bytes.Buffer
		env := &cmdline.Env{Stdout: &stdout}
		if err := ParseAndRunForTest(cmdRoot, ctx, env, []string{tc.cmd}); err != nil {
			t.Errorf("ParseAndRunForTest failed: %v", err)
		}
		if got, want := stdout.String(), tc.stdout; got != want {
			t.Errorf("got stdout \"%s\", want \"%s\"", got, want)
		}
		shutdown()
	}
}
