// Copyright 2021 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 gitfs

import (
	"io/fs"
	"os"
	"testing"
)

func TestGerrit(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping Gerrit network access in -short mode")
	}
	r, err := NewRepo("https://go.googlesource.com/scratch")
	if err != nil {
		t.Fatal(err)
	}
	_, fsys, err := r.Clone("HEAD")
	if err != nil {
		t.Fatal(err)
	}
	data, err := fs.ReadFile(fsys, "README.md")
	if err != nil {
		t.Fatal(err)
	}
	t.Log(string(data))
}

func TestGitHub(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping GitHub network access in -short mode")
	}
	r, err := NewRepo("https://github.com/rsc/quote")
	if err != nil {
		t.Fatal(err)
	}
	_, fsys, err := r.Clone("HEAD")
	if err != nil {
		t.Fatal(err)
	}
	data, err := fs.ReadFile(fsys, "README.md")
	if err != nil {
		t.Fatal(err)
	}
	t.Log(string(data))
}

func TestPack(t *testing.T) {
	data, err := os.ReadFile("testdata/scratch.pack")
	if err != nil {
		t.Fatal(err)
	}
	var s store
	err = unpack(&s, data)
	if err != nil {
		t.Fatal(err)
	}

	h := Hash{0xf6, 0xf7, 0x39, 0x2a, 0x99, 0x9b, 0x3d, 0x75, 0xe2, 0x1c, 0xae, 0xe3, 0x3a, 0xeb, 0x6d, 0x01, 0x92, 0xe8, 0xdc, 0x6b}
	tfs, err := s.commit(h)
	if err != nil {
		t.Fatal(err)
	}

	data, err = fs.ReadFile(tfs, "rsc/greeting.go")
	if err != nil {
		t.Fatal(err)
	}
	println(string(data))
}
