// Copyright 2014 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 flate

import (
	"bufio"
	"bytes"
	"io"
	"strings"
	"testing"
)

func TestReset(t *testing.T) {
	ss := []string{
		"lorem ipsum izzle fo rizzle",
		"the quick brown fox jumped over",
	}

	deflated := make([]bytes.Buffer, 2)
	for i, s := range ss {
		w, _ := NewWriter(&deflated[i], 1)
		w.Write([]byte(s))
		w.Close()
	}

	inflated := make([]bytes.Buffer, 2)

	f := NewReader(&deflated[0])
	io.Copy(&inflated[0], f)
	f.(Resetter).Reset(&deflated[1], nil)
	io.Copy(&inflated[1], f)
	f.Close()

	for i, s := range ss {
		if s != inflated[i].String() {
			t.Errorf("inflated[%d]:\ngot  %q\nwant %q", i, &inflated[i], s)
		}
	}
}

func TestReaderTruncated(t *testing.T) {
	vectors := []struct{ input, output string }{
		{"\x00", ""},
		{"\x00\f", ""},
		{"\x00\f\x00", ""},
		{"\x00\f\x00\xf3\xff", ""},
		{"\x00\f\x00\xf3\xffhello", "hello"},
		{"\x00\f\x00\xf3\xffhello, world", "hello, world"},
		{"\x02", ""},
		{"\xf2H\xcd", "He"},
		{"\xf2H͙0a\u0084\t", "Hel\x90\x90\x90\x90\x90"},
		{"\xf2H͙0a\u0084\t\x00", "Hel\x90\x90\x90\x90\x90"},
	}

	for i, v := range vectors {
		r := strings.NewReader(v.input)
		zr := NewReader(r)
		b, err := io.ReadAll(zr)
		if err != io.ErrUnexpectedEOF {
			t.Errorf("test %d, error mismatch: got %v, want io.ErrUnexpectedEOF", i, err)
		}
		if string(b) != v.output {
			t.Errorf("test %d, output mismatch: got %q, want %q", i, b, v.output)
		}
	}
}

func TestResetDict(t *testing.T) {
	dict := []byte("the lorem fox")
	ss := []string{
		"lorem ipsum izzle fo rizzle",
		"the quick brown fox jumped over",
	}

	deflated := make([]bytes.Buffer, len(ss))
	for i, s := range ss {
		w, _ := NewWriterDict(&deflated[i], DefaultCompression, dict)
		w.Write([]byte(s))
		w.Close()
	}

	inflated := make([]bytes.Buffer, len(ss))

	f := NewReader(nil)
	for i := range inflated {
		f.(Resetter).Reset(&deflated[i], dict)
		io.Copy(&inflated[i], f)
	}
	f.Close()

	for i, s := range ss {
		if s != inflated[i].String() {
			t.Errorf("inflated[%d]:\ngot  %q\nwant %q", i, &inflated[i], s)
		}
	}
}

func TestReaderReusesReaderBuffer(t *testing.T) {
	encodedReader := bytes.NewReader([]byte{})
	encodedNotByteReader := struct{ io.Reader }{encodedReader}

	t.Run("BufferIsReused", func(t *testing.T) {
		f := NewReader(encodedNotByteReader).(*decompressor)
		bufioR, ok := f.r.(*bufio.Reader)
		if !ok {
			t.Fatalf("bufio.Reader should be created")
		}
		f.Reset(encodedNotByteReader, nil)
		if bufioR != f.r {
			t.Fatalf("bufio.Reader was not reused")
		}
	})
	t.Run("BufferIsNotReusedWhenGotByteReader", func(t *testing.T) {
		f := NewReader(encodedNotByteReader).(*decompressor)
		if _, ok := f.r.(*bufio.Reader); !ok {
			t.Fatalf("bufio.Reader should be created")
		}
		f.Reset(encodedReader, nil)
		if f.r != encodedReader {
			t.Fatalf("provided io.ByteReader should be used directly")
		}
	})
	t.Run("BufferIsCreatedAfterByteReader", func(t *testing.T) {
		for i, r := range []io.Reader{encodedReader, bufio.NewReader(encodedReader)} {
			f := NewReader(r).(*decompressor)
			if f.r != r {
				t.Fatalf("provided io.ByteReader should be used directly, i=%d", i)
			}
			f.Reset(encodedNotByteReader, nil)
			if _, ok := f.r.(*bufio.Reader); !ok {
				t.Fatalf("bufio.Reader should be created, i=%d", i)
			}
		}
	})
}
