package storage

import (
	"testing"
)

func TestPartHeaderParseFromPath(t *testing.T) {
	testParseFromPathError := func(path string) {
		t.Helper()

		var ph partHeader
		if err := ph.ParseFromPath(path); err == nil {
			t.Fatalf("expecting non-nil error")
		}
	}

	t.Run("Error", func(t *testing.T) {
		testParseFromPathError("")
		testParseFromPathError("foobar")
		testParseFromPathError("/foo/bar")
		testParseFromPathError("/rowscount_mintimestamp_maxtimestamp_garbage")
		testParseFromPathError("/rowscount_mintimestamp_maxtimestamp_garbage")
		testParseFromPathError("/12_3456_mintimestamp_maxtimestamp_garbage")
		testParseFromPathError("/12_3456_20181011010203.456_maxtimestamp_garbage")
		testParseFromPathError("/12_3456_20181011010203.456_20181011010202.456_garbage")
		testParseFromPathError("12_3456_20181011010203.456_20181011010203.457_garbage")
		testParseFromPathError("12_3456_20181011010203.456_20181011010203.457_garbage/")

		// MinTimestamp > MaxTimetamp
		testParseFromPathError("1233_456_20181011010203.456_20181011010202.457_garbage")

		// Zero rowsCount
		testParseFromPathError("0_123_20181011010203.456_20181011010203.457_garbage")

		// Zero blocksCount
		testParseFromPathError("123_0_20181011010203.456_20181011010203.457_garbage")

		// blocksCount > rowsCount
		testParseFromPathError("123_456_20181011010203.456_20181011010203.457_garbage")
	})

	testParseFromPathSuccess := func(path string, phStringExpected string) {
		t.Helper()

		var ph partHeader
		if err := ph.ParseFromPath(path); err != nil {
			t.Fatalf("unexpected error when parsing path %q: %s", path, err)
		}
		phString := ph.String()
		if phString != phStringExpected {
			t.Fatalf("unexpected partHeader string for path %q: got %q; want %q", path, phString, phStringExpected)
		}
	}

	t.Run("Success", func(t *testing.T) {
		testParseFromPathSuccess("/1233_456_20181011010203.456_20181011010203.457_garbage", "1233_456_20181011010203.456_20181011010203.457")
		testParseFromPathSuccess("/1233_456_20181011010203.456_20181011010203.457_garbage/", "1233_456_20181011010203.456_20181011010203.457")
		testParseFromPathSuccess("/1233_456_20181011010203.456_20181011010203.457_garbage///", "1233_456_20181011010203.456_20181011010203.457")
		testParseFromPathSuccess("/var/lib/tsdb/1233_456_20181011010203.456_20181011010203.457_garbage///", "1233_456_20181011010203.456_20181011010203.457")
		testParseFromPathSuccess("/var/lib/tsdb/456_456_20181011010203.456_20181011010203.457_232345///", "456_456_20181011010203.456_20181011010203.457")
	})
}