// Copyright 2009 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 linebreaks

import (
	"bytes"
	"fmt"
	"io"
	"os"
	"reflect"
	"strings"
	"testing"
)

type writerTestEntry struct {
	header		*Header
	contents	string
}

type writerTest struct {
	file	string	// filename of expected output
	entries	[]*writerTestEntry
}

var writerTests = []*writerTest{
	&writerTest{
		file:	"testdata/writer.tar",
		entries: []*writerTestEntry{
			&writerTestEntry{
				header: &Header{
					Name:		"small.txt",
					Mode:		0640,
					Uid:		73025,
					Gid:		5000,
					Size:		5,
					Mtime:		1246508266,
					Typeflag:	'0',
					Uname:		"dsymonds",
					Gname:		"eng",
				},
				contents:	"Kilts",
			},
			&writerTestEntry{
				header: &Header{
					Name:		"small2.txt",
					Mode:		0640,
					Uid:		73025,
					Gid:		5000,
					Size:		11,
					Mtime:		1245217492,
					Typeflag:	'0',
					Uname:		"dsymonds",
					Gname:		"eng",
				},
				contents:	"Google.com\n",
			},
		},
	},
	// The truncated test file was produced using these commands:
	//   dd if=/dev/zero bs=1048576 count=16384 > /tmp/16gig.txt
	//   tar -b 1 -c -f- /tmp/16gig.txt | dd bs=512 count=8 > writer-big.tar
	&writerTest{
		file:	"testdata/writer-big.tar",
		entries: []*writerTestEntry{
			&writerTestEntry{
				header: &Header{
					Name:		"tmp/16gig.txt",
					Mode:		0640,
					Uid:		73025,
					Gid:		5000,
					Size:		16 << 30,
					Mtime:		1254699560,
					Typeflag:	'0',
					Uname:		"dsymonds",
					Gname:		"eng",
				},
				// no contents
			},
		},
	},
}

type untarTest struct {
	file	string
	headers	[]*Header
}

var untarTests = []*untarTest{
	&untarTest{
		file:	"testdata/gnu.tar",
		headers: []*Header{
			&Header{
				Name:		"small.txt",
				Mode:		0640,
				Uid:		73025,
				Gid:		5000,
				Size:		5,
				Mtime:		1244428340,
				Typeflag:	'0',
				Uname:		"dsymonds",
				Gname:		"eng",
			},
			&Header{
				Name:		"small2.txt",
				Mode:		0640,
				Uid:		73025,
				Gid:		5000,
				Size:		11,
				Mtime:		1244436044,
				Typeflag:	'0',
				Uname:		"dsymonds",
				Gname:		"eng",
			},
		},
	},
	&untarTest{
		file:	"testdata/star.tar",
		headers: []*Header{
			&Header{
				Name:		"small.txt",
				Mode:		0640,
				Uid:		73025,
				Gid:		5000,
				Size:		5,
				Mtime:		1244592783,
				Typeflag:	'0',
				Uname:		"dsymonds",
				Gname:		"eng",
				Atime:		1244592783,
				Ctime:		1244592783,
			},
			&Header{
				Name:		"small2.txt",
				Mode:		0640,
				Uid:		73025,
				Gid:		5000,
				Size:		11,
				Mtime:		1244592783,
				Typeflag:	'0',
				Uname:		"dsymonds",
				Gname:		"eng",
				Atime:		1244592783,
				Ctime:		1244592783,
			},
		},
	},
	&untarTest{
		file:	"testdata/v7.tar",
		headers: []*Header{
			&Header{
				Name:		"small.txt",
				Mode:		0444,
				Uid:		73025,
				Gid:		5000,
				Size:		5,
				Mtime:		1244593104,
				Typeflag:	'\x00',
			},
			&Header{
				Name:		"small2.txt",
				Mode:		0444,
				Uid:		73025,
				Gid:		5000,
				Size:		11,
				Mtime:		1244593104,
				Typeflag:	'\x00',
			},
		},
	},
}

var facts = map[int]string{
	0:	"1",
	1:	"1",
	2:	"2",
	10:	"3628800",
	20:	"2432902008176640000",
	100: "933262154439441526816992388562667004907159682643816214685929" +
		"638952175999932299156089414639761565182862536979208272237582" +
		"51185210916864000000000000000000000000",
}

func usage() {
	fmt.Fprintf(os.Stderr,
		// TODO(gri): the 2nd string of this string list should not be indented
		"usage: godoc package [name ...]\n"+
			"	godoc -http=:6060\n")
	flag.PrintDefaults()
	os.Exit(2)
}

func TestReader(t *testing.T) {
testLoop:
	for i, test := range untarTests {
		f, err := os.Open(test.file, os.O_RDONLY, 0444)
		if err != nil {
			t.Errorf("test %d: Unexpected error: %v", i, err)
			continue
		}
		tr := NewReader(f)
		for j, header := range test.headers {
			hdr, err := tr.Next()
			if err != nil || hdr == nil {
				t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err)
				f.Close()
				continue testLoop
			}
			if !reflect.DeepEqual(hdr, header) {
				t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
					i, j, *hdr, *header)
			}
		}
		hdr, err := tr.Next()
		if hdr != nil || err != nil {
			t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, err)
		}
		f.Close()
	}
}

// Respect line breaks in function calls.
func _() {
	f(x)
	f(x,
		x)
	f(x,
		x,
	)
	f(
		x,
		x)
	f(
		x,
		x,
	)
}

// Respect line breaks in function declarations.
func _(x T)	{}
func _(x T,
	y T) {
}
func _(x T,
	y T,
) {
}
func _(
	x T,
	y T) {
}
func _(
	x T,
	y T,
) {
}

// Example from issue #2597.
func ManageStatus0(
	in <-chan *Status,
	req <-chan Request,
	stat chan<- *TargetInfo,
	TargetHistorySize int) {
}

func ManageStatus1(
	in <-chan *Status,
	req <-chan Request,
	stat chan<- *TargetInfo,
	TargetHistorySize int,
) {
}

// Example from issue #9064.
func (y *y) xerrors() error {
	_ = "xerror.test"	//TODO-
	_ = []byte(`
foo bar foo bar foo bar
`) //TODO-
}

func _() {
	_ = "abc"		// foo
	_ = `abc_0123456789_`	// foo
}

func _() {
	_ = "abc"	// foo
	_ = `abc
0123456789
` // foo
}

// There should be exactly one linebreak after this comment.
