// Copyright 2016 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 buildutil_test

import (
	"go/build"
	"io/ioutil"
	"reflect"
	"strings"
	"testing"

	"golang.org/x/tools/go/buildutil"
)

func TestParseOverlayArchive(t *testing.T) {
	var tt = []struct {
		in     string
		out    map[string][]byte
		hasErr bool
	}{
		{
			"a.go\n5\n12345",
			map[string][]byte{"a.go": []byte("12345")},
			false,
		},
		{
			"a.go\n5\n1234",
			nil,
			true,
		},
		{
			"a.go\n5\n12345b.go\n4\n1234",
			map[string][]byte{"a.go": []byte("12345"), "b.go": []byte("1234")},
			false,
		},
	}

	for _, test := range tt {
		got, err := buildutil.ParseOverlayArchive(strings.NewReader(test.in))
		if err == nil && test.hasErr {
			t.Errorf("expected error for %q", test.in)
		}
		if err != nil && !test.hasErr {
			t.Errorf("unexpected error %v for %q", err, test.in)
		}
		if !reflect.DeepEqual(got, test.out) {
			t.Errorf("got %#v, want %#v", got, test.out)
		}
	}
}

func TestOverlay(t *testing.T) {
	ctx := &build.Default
	ov := map[string][]byte{
		"/somewhere/a.go": []byte("file contents"),
	}
	names := []string{"/somewhere/a.go", "/somewhere//a.go"}
	ctx = buildutil.OverlayContext(ctx, ov)
	for _, name := range names {
		f, err := buildutil.OpenFile(ctx, name)
		if err != nil {
			t.Errorf("unexpected error %v", err)
		}
		b, err := ioutil.ReadAll(f)
		if err != nil {
			t.Errorf("unexpected error %v", err)
		}
		if got, expected := string(b), string(ov["/somewhere/a.go"]); got != expected {
			t.Errorf("read %q, expected %q", got, expected)
		}
	}
}
