// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package tfdiags

import (
	"bytes"
	"encoding/gob"
	"fmt"
	"reflect"
	"testing"

	"github.com/davecgh/go-spew/spew"

	"github.com/hashicorp/hcl/v2"
)

func TestDiagnosticsForRPC(t *testing.T) {
	var diags Diagnostics
	diags = diags.Append(fmt.Errorf("bad"))
	diags = diags.Append(SimpleWarning("less bad"))
	diags = diags.Append(&hcl.Diagnostic{
		Severity: hcl.DiagError,
		Summary:  "bad bad bad",
		Detail:   "badily bad bad",
		Subject: &hcl.Range{
			Filename: "foo",
		},
		Context: &hcl.Range{
			Filename: "bar",
		},
	})

	buf := bytes.Buffer{}
	enc := gob.NewEncoder(&buf)
	dec := gob.NewDecoder(&buf)

	rpcDiags := diags.ForRPC()
	err := enc.Encode(rpcDiags)
	if err != nil {
		t.Fatalf("error on Encode: %s", err)
	}

	var got Diagnostics
	err = dec.Decode(&got)
	if err != nil {
		t.Fatalf("error on Decode: %s", err)
	}

	want := Diagnostics{
		&rpcFriendlyDiag{
			Severity_: Error,
			Summary_:  "bad",
		},
		&rpcFriendlyDiag{
			Severity_: Warning,
			Summary_:  "less bad",
		},
		&rpcFriendlyDiag{
			Severity_: Error,
			Summary_:  "bad bad bad",
			Detail_:   "badily bad bad",
			Subject_: &SourceRange{
				Filename: "foo",
			},
			Context_: &SourceRange{
				Filename: "bar",
			},
		},
	}

	if !reflect.DeepEqual(got, want) {
		t.Errorf("wrong result\ngot: %swant: %s", spew.Sdump(got), spew.Sdump(want))
	}
}
