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

import (
	"flag"
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"testing"
)

var testDataDir = flag.String("test_data_dir", "", "Path to test data; only used in GN build")

func TestPatternsMatchExamples(t *testing.T) {
	wantDirs := []string{"examples", "patterns"}
	for _, folder := range wantDirs {
		p := filepath.Join(*testDataDir, folder)
		if _, err := os.Stat(p); os.IsNotExist(err) {
			t.Errorf("%v(%v doesn't exist): got %v, want %v", t.Name(), p, err, nil)
		}
	}
	examplesRoot := filepath.Join(*testDataDir, "examples")
	exampleFilesPath := []string{}
	err := filepath.Walk(examplesRoot,
		func(path string, info os.FileInfo, err error) error {
			if info.IsDir() {
				return nil
			}
			exampleFilesPath = append(exampleFilesPath, path)
			return nil
		})
	if err != nil {
		t.Errorf("%v, got %v", t.Name(), err)
	}

	patternsRoot := filepath.Join(*testDataDir, "patterns")
	patternFilesPath := []string{}
	err = filepath.Walk(patternsRoot,
		func(path string, info os.FileInfo, err error) error {
			if info.IsDir() {
				return nil
			}
			patternFilesPath = append(patternFilesPath, path)
			return nil
		})
	if err != nil {
		t.Errorf("%v, got %v", t.Name(), err)
	}

	if len(exampleFilesPath) != len(patternFilesPath) {
		t.Errorf("%v, got %v != %v", t.Name(), len(exampleFilesPath), len(patternFilesPath))
	}

	for _, patternFilePath := range patternFilesPath {
		patternFile, err := ioutil.ReadFile(patternFilePath)
		if err != nil {
			t.Errorf("%v, got %v", t.Name(), err)
		}
		exampleFilePath := strings.Replace(patternFilePath, ".lic", ".txt", -1)
		exampleFilePath = strings.Replace(exampleFilePath, "patterns", "examples", -1)
		exampleFile, err := ioutil.ReadFile(exampleFilePath)
		if err != nil {
			t.Errorf("%v, got %v", t.Name(), err)
		}
		regex := string(patternFile)
		// Update regex to ignore multiple white spaces, newlines, comments.
		// But first, trim whitespace away so we don't include unnecessary
		// comment syntax.
		regex = strings.Trim(regex, "\n ")
		regex = strings.ReplaceAll(regex, "\n", `[\s\\#\*\/]*`)
		regex = strings.ReplaceAll(regex, " ", `[\s\\#\*\/]*`)

		if !regexp.MustCompile(regex).Match(exampleFile) {
			t.Errorf("%v, %v pattern doesn't match example", t.Name(), patternFilePath)
		}
	}
}
