// Copyright 2015 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

import (
	"bytes"
	"fmt"
	"go/format"
	"io/ioutil"
	"log"
)

// This program generates tests to verify that copying operations
// copy the data they are supposed to and clobber no adjacent values.

// run as `go run copyGen.go`.  A file called copy_ssa.go
// will be written into the parent directory containing the tests.

var sizes = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 23, 24, 25, 31, 32, 33, 63, 64, 65, 1023, 1024, 1025, 1024 + 7, 1024 + 8, 1024 + 9, 1024 + 15, 1024 + 16, 1024 + 17}

func main() {
	w := new(bytes.Buffer)
	fmt.Fprintf(w, "// run\n")
	fmt.Fprintf(w, "// autogenerated from gen/copyGen.go - do not edit!\n")
	fmt.Fprintf(w, "package main\n")
	fmt.Fprintf(w, "import \"fmt\"\n")

	for _, s := range sizes {
		// type for test
		fmt.Fprintf(w, "type T%d struct {\n", s)
		fmt.Fprintf(w, "  pre [8]byte\n")
		fmt.Fprintf(w, "  mid [%d]byte\n", s)
		fmt.Fprintf(w, "  post [8]byte\n")
		fmt.Fprintf(w, "}\n")

		// function being tested
		fmt.Fprintf(w, "func t%dcopy_ssa(y, x *[%d]byte) {\n", s, s)
		fmt.Fprintf(w, "  switch{}\n")
		fmt.Fprintf(w, "  *y = *x\n")
		fmt.Fprintf(w, "}\n")

		// testing harness
		fmt.Fprintf(w, "func testCopy%d() {\n", s)
		fmt.Fprintf(w, "  a := T%d{[8]byte{201, 202, 203, 204, 205, 206, 207, 208},[%d]byte{", s, s)
		for i := 0; i < s; i++ {
			fmt.Fprintf(w, "%d,", i%100)
		}
		fmt.Fprintf(w, "},[8]byte{211, 212, 213, 214, 215, 216, 217, 218}}\n")
		fmt.Fprintf(w, "  x := [%d]byte{", s)
		for i := 0; i < s; i++ {
			fmt.Fprintf(w, "%d,", 100+i%100)
		}
		fmt.Fprintf(w, "}\n")
		fmt.Fprintf(w, "  t%dcopy_ssa(&a.mid, &x)\n", s)
		fmt.Fprintf(w, "  want := T%d{[8]byte{201, 202, 203, 204, 205, 206, 207, 208},[%d]byte{", s, s)
		for i := 0; i < s; i++ {
			fmt.Fprintf(w, "%d,", 100+i%100)
		}
		fmt.Fprintf(w, "},[8]byte{211, 212, 213, 214, 215, 216, 217, 218}}\n")
		fmt.Fprintf(w, "  if a != want {\n")
		fmt.Fprintf(w, "    fmt.Printf(\"t%dcopy got=%%v, want %%v\\n\", a, want)\n", s)
		fmt.Fprintf(w, "    failed=true\n")
		fmt.Fprintf(w, "  }\n")
		fmt.Fprintf(w, "}\n")
	}

	// boilerplate at end
	fmt.Fprintf(w, "var failed bool\n")
	fmt.Fprintf(w, "func main() {\n")
	for _, s := range sizes {
		fmt.Fprintf(w, "  testCopy%d()\n", s)
	}
	fmt.Fprintf(w, "  if failed {\n")
	fmt.Fprintf(w, "    panic(\"failed\")\n")
	fmt.Fprintf(w, "  }\n")
	fmt.Fprintf(w, "}\n")

	// gofmt result
	b := w.Bytes()
	src, err := format.Source(b)
	if err != nil {
		fmt.Printf("%s\n", b)
		panic(err)
	}

	// write to file
	err = ioutil.WriteFile("../copy_ssa.go", src, 0666)
	if err != nil {
		log.Fatalf("can't write output: %v\n", err)
	}
}
