// 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 filetree

import (
	"encoding/json"
	"flag"
	"os"
	"path/filepath"
	"strings"
	"testing"
)

var testDataDir = flag.String("test_data_dir", "", "Path to test data directory")

// NewFileTree(empty) should produce a filetree object that correctly
// represents an empty directory.
func TestFileTreeCreateEmpty(t *testing.T) {
	want, got := setupFileTreeTestDir("empty", t)
	if got != want {
		t.Errorf("%v(): got \n%v\n, want \n%v\n", t.Name(), got, want)
	}
}

// NewFileTree(simple) should produce a filetree object that correctly
// represents the simple testdata directory.
func TestFileTreeCreateSimple(t *testing.T) {
	want, got := setupFileTreeTestDir("simple", t)
	if got != want {
		t.Errorf("%v(): got \n%v\n, want \n%v\n", t.Name(), got, want)
	}
}

// NewFileTree(skip) should produce a filetree object that correctly
// skips the configured directories.
func TestFileTreeWithSkips(t *testing.T) {
	want, got := setupFileTreeTestDir("skipdir", t)
	if got != want {
		t.Errorf("%v(): got \n%v\n, want \n%v\n", t.Name(), got, want)
	}
}

func setupFileTreeTestDir(name string, t *testing.T) (string, string) {
	// Find the right testdata directory for this test.
	testDir := filepath.Join(*testDataDir, name)
	root := filepath.Join(testDir, "root")

	// Create a FileTree object from the want.json file.
	want, err := os.ReadFile(filepath.Join(testDir, "want.json"))
	if err != nil {
		t.Fatal(err)
	}
	wantString := strings.Replace(string(want), "{root}", root, -1)
	want = []byte(wantString)

	// Load the accompanying config file for this test type.
	configJson, err := os.ReadFile(filepath.Join(testDir, "config.json"))
	if err != nil {
		t.Fatal(err)
	}
	configString := strings.Replace(string(configJson), "{root}", root, -1)
	configJson = []byte(configString)

	// Unmarshal the config json data into the Config object, and run
	// NewFileTree.
	c := NewConfig()
	if err = json.Unmarshal(configJson, c); err != nil {
		t.Fatal(err)
	}
	Config = c

	gotTree, err := NewFileTree(root, nil)
	if err != nil {
		t.Fatal(err)
	}

	// Return the results of NewFileTree and the expected json text
	// for direct comparison.
	got, err := json.MarshalIndent(gotTree, "", "    ")
	if err != nil {
		t.Fatal(err)
	}

	return strings.TrimSpace(string(want)), strings.TrimSpace(string(got))
}
