// Copyright 2022 The Fuchsia 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 file

import (
	"bytes"
	"io/ioutil"
	"path/filepath"
	"testing"
)

func TestFileCreatedSuccessfully(t *testing.T) {
	setup()
	filename := filepath.Join(t.TempDir(), "success.txt")
	if err := ioutil.WriteFile(filename, []byte("Example Text"), 0600); err != nil {
		t.Fatal(err)
	}

	if _, err := NewFile(filename, SingleLicense); err != nil {
		t.Fatal(err)
	}
}

func TestFileCreationFails(t *testing.T) {
	setup()
	filename := filepath.Join(t.TempDir(), "failure.txt")

	if _, err := NewFile(filename, SingleLicense); err == nil {
		t.Fatal(err)
	}
}

func TestReplacements(t *testing.T) {
	setup()
	r := []*Replacement{
		{
			Replace: "“",
			With:    "\"",
		}, {
			Replace: "”",
			With:    "\"",
		},
	}
	Config.Replacements = r
	expected := []byte("left quote: \" right quote: \"")

	filename := filepath.Join(t.TempDir(), "replacement.txt")
	if err := ioutil.WriteFile(filename, []byte("left quote: “ right quote: ”"), 0600); err != nil {
		t.Fatal(err)
	}

	f, err := NewFile(filename, SingleLicense)
	if err != nil {
		t.Fatal(err)
	}
	if len(f.Data) != 1 {
		t.Fatalf("Expected 1 data element, got %v\n", len(f.Data))
	}
	if !bytes.Equal(f.Data[0].Data, expected) {
		t.Fatalf("Expected %v, got %v\n", string(expected), string(f.Data[0].Data))
	}
}

func setup() {
	Config = &FileConfig{}
}
