// Copyright 2017 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 main_test

import (
	"bytes"
	"internal/testenv"
	"io/ioutil"
	"os"
	"os/exec"
	"strings"
	"testing"
)

func TestDeps(t *testing.T) {
	t.Skip("broken - golang.org/issue/21522")
	if testing.Short() && testenv.Builder() == "" {
		t.Skip("skipping in short mode")
	}

	current, err := ioutil.ReadFile("deps.go")
	if err != nil {
		t.Fatal(err)
	}

	bash, err := exec.LookPath("bash")
	if err != nil {
		t.Skipf("skipping because bash not found: %v", err)
	}

	outf, err := ioutil.TempFile("", "dist-deps-test")
	if err != nil {
		t.Fatal(err)
	}
	outf.Close()
	outname := outf.Name()
	defer os.Remove(outname)

	out, err := exec.Command(bash, "mkdeps.bash", outname).CombinedOutput()
	if err != nil {
		t.Fatal(err)
	}
	t.Logf("%s", out)

	updated, err := ioutil.ReadFile(outname)
	if err != nil {
		t.Fatal(err)
	}

	if !bytes.Equal(current, updated) {
		// Very simple minded diff.
		t.Log("-current +generated")
		clines := strings.Split(string(current), "\n")
		for i, line := range clines {
			clines[i] = strings.Join(strings.Fields(line), " ")
		}
		ulines := strings.Split(string(updated), "\n")
		for i, line := range ulines {
			ulines[i] = strings.Join(strings.Fields(line), " ")
		}
		for len(clines) > 0 {
			cl := clines[0]
			switch {
			case len(ulines) == 0:
				t.Logf("-%s", cl)
				clines = clines[1:]
			case cl == ulines[0]:
				clines = clines[1:]
				ulines = ulines[1:]
			case pkg(cl) == pkg(ulines[0]):
				t.Logf("-%s", cl)
				t.Logf("+%s", ulines[0])
				clines = clines[1:]
				ulines = ulines[1:]
			case pkg(cl) < pkg(ulines[0]):
				t.Logf("-%s", cl)
				clines = clines[1:]
			default:
				cp := pkg(cl)
				for len(ulines) > 0 && pkg(ulines[0]) < cp {
					t.Logf("+%s", ulines[0])
					ulines = ulines[1:]
				}
			}
		}

		t.Error("cmd/dist/deps.go is out of date; run cmd/dist/mkdeps.bash")
	}
}

// pkg returns the package of a line in deps.go.
func pkg(line string) string {
	i := strings.Index(line, `"`)
	if i < 0 {
		return ""
	}
	line = line[i+1:]
	i = strings.Index(line, `"`)
	if i < 0 {
		return ""
	}
	return line[:i]
}
