// Copyright 2020 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 embedtest_test

import (
	"embed"
	"io/ioutil"
	"testing"
)

var (
	global2      = global
	concurrency2 = concurrency
	glass2       = glass
	sbig2        = sbig
	bbig2        = bbig
)

//go:embed testdata/*.txt
var global embed.FS

//go:embed c*txt
var concurrency string

//go:embed testdata/g*.txt
var glass []byte

//go:embed testdata/ascii.txt
var sbig string

//go:embed testdata/ascii.txt
var bbig []byte

func testFiles(t *testing.T, f embed.FS, name, data string) {
	t.Helper()
	d, err := f.ReadFile(name)
	if err != nil {
		t.Error(err)
		return
	}
	if string(d) != data {
		t.Errorf("read %v = %q, want %q", name, d, data)
	}
}

func testString(t *testing.T, s, name, data string) {
	t.Helper()
	if s != data {
		t.Errorf("%v = %q, want %q", name, s, data)
	}
}

func TestXGlobal(t *testing.T) {
	testFiles(t, global, "testdata/hello.txt", "hello, world\n")
	testString(t, concurrency, "concurrency", "Concurrency is not parallelism.\n")
	testString(t, string(glass), "glass", "I can eat glass and it doesn't hurt me.\n")
	testString(t, concurrency2, "concurrency2", "Concurrency is not parallelism.\n")
	testString(t, string(glass2), "glass2", "I can eat glass and it doesn't hurt me.\n")

	big, err := ioutil.ReadFile("testdata/ascii.txt")
	if err != nil {
		t.Fatal(err)
	}
	testString(t, sbig, "sbig", string(big))
	testString(t, sbig2, "sbig2", string(big))
	testString(t, string(bbig), "bbig", string(big))
	testString(t, string(bbig2), "bbig", string(big))

	if t.Failed() {
		return
	}

	// Could check &glass[0] == &glass2[0] but also want to make sure write does not fault
	// (data must not be in read-only memory).
	old := glass[0]
	glass[0]++
	if glass2[0] != glass[0] {
		t.Fatalf("glass and glass2 do not share storage")
	}
	glass[0] = old

	// Could check &bbig[0] == &bbig2[0] but also want to make sure write does not fault
	// (data must not be in read-only memory).
	old = bbig[0]
	bbig[0]++
	if bbig2[0] != bbig[0] {
		t.Fatalf("bbig and bbig2 do not share storage")
	}
	bbig[0] = old
}

func TestXLocal(t *testing.T) {
	//go:embed testdata/*o.txt
	var local embed.FS
	testFiles(t, local, "testdata/hello.txt", "hello, world\n")

	//go:embed testdata/k*.txt
	var s string
	testString(t, s, "local variable s", "If a program is too slow, it must have a loop.\n")

	//go:embed testdata/h*.txt
	var b []byte
	testString(t, string(b), "local variable b", "hello, world\n")
}
