// Copyright (c) Tailscale Inc & contributors
// SPDX-License-Identifier: BSD-3-Clause

package taildrop

import (
	"strings"
	"testing"
)

func TestNextFilename(t *testing.T) {
	tests := []struct {
		in    string
		want  string
		want2 string
	}{
		{"foo", "foo (1)", "foo (2)"},
		{"foo(1)", "foo(1) (1)", "foo(1) (2)"},
		{"foo.tar", "foo (1).tar", "foo (2).tar"},
		{"foo.tar.gz", "foo (1).tar.gz", "foo (2).tar.gz"},
		{".bashrc", ".bashrc (1)", ".bashrc (2)"},
		{"fizz buzz.torrent", "fizz buzz (1).torrent", "fizz buzz (2).torrent"},
		{"rawr 2023.12.15.txt", "rawr 2023.12.15 (1).txt", "rawr 2023.12.15 (2).txt"},
		{"IMG_7934.JPEG", "IMG_7934 (1).JPEG", "IMG_7934 (2).JPEG"},
		{"my song.mp3", "my song (1).mp3", "my song (2).mp3"},
		{"archive.7z", "archive (1).7z", "archive (2).7z"},
		{"foo/bar/fizz", "foo/bar/fizz (1)", "foo/bar/fizz (2)"},
		{"新完全マスター　N2　文法.pdf", "新完全マスター　N2　文法 (1).pdf", "新完全マスター　N2　文法 (2).pdf"},
	}

	for _, tt := range tests {
		if got := nextFilename(tt.in); got != tt.want {
			t.Errorf("NextFilename(%q) = %q, want %q", tt.in, got, tt.want)
		}
		if got2 := nextFilename(tt.want); got2 != tt.want2 {
			t.Errorf("NextFilename(%q) = %q, want %q", tt.want, got2, tt.want2)
		}
	}
}

func TestValidateBaseName(t *testing.T) {
	tests := []struct {
		in     string
		wantOk bool
	}{
		{"", false},
		{"foo", true},
		{"./foo", false},
		{"../foo", false},
		{"foo/bar", false},
		{"😋", true},
		{"\xde\xad\xbe\xef", false},
		{"foo.partial", false},
		{"foo.deleted", false},
		{strings.Repeat("a", 1024), false},
		{"foo:bar", false},
	}
	for _, tt := range tests {
		err := validateBaseName(tt.in)
		gotOk := err == nil
		if gotOk != tt.wantOk {
			t.Errorf("validateBaseName(%q) = %v, wantOk = %v", tt.in, err, tt.wantOk)
		}
	}
}
