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

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"
)

// CodeSize builds the given code sample and returns the binary size or en error
// if an error occurred. The code sample typically will look like this:
//
//	package main
//	import "golang.org/x/text/somepackage"
//	func main() {
//	    somepackage.Func() // reference Func to cause it to be linked in.
//	}
//
// See dict_test.go in the display package for an example.
func CodeSize(s string) (int, error) {
	// Write the file.
	tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext")
	if err != nil {
		return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err)
	}
	defer os.RemoveAll(tmpdir)
	filename := filepath.Join(tmpdir, "main.go")
	if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil {
		return 0, fmt.Errorf("testtext: failed to write main.go: %v", err)
	}

	// Build the binary.
	w := &bytes.Buffer{}
	cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main")
	cmd.Dir = tmpdir
	cmd.Stderr = w
	cmd.Stdout = w
	if err := cmd.Run(); err != nil {
		return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w)
	}

	// Determine the size.
	fi, err := os.Stat(filepath.Join(tmpdir, "main"))
	if err != nil {
		return 0, fmt.Errorf("testtext: failed to get file info: %v", err)
	}
	return int(fi.Size()), nil
}
