// 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"
	"os"
	"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 := os.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")
}
