From c0709aff6ac85b813ef3ccc89fa312f17af05e2e Mon Sep 17 00:00:00 2001 From: BroodjeAap Date: Tue, 26 Jul 2022 19:52:49 +0000 Subject: [PATCH] added tests for substring filter and fixed a bunch of bugs in substring filter --- scraping.go | 40 ++++++++++++++++++++++++++++-------- scraping_test.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 9 deletions(-) create mode 100644 scraping_test.go diff --git a/scraping.go b/scraping.go index d990a88..bf00f2e 100644 --- a/scraping.go +++ b/scraping.go @@ -69,23 +69,45 @@ func getFilterResultSubstring(s string, filter *Filter) string { asRunes := []rune(s) for _, substring := range substrings { - if strings.Contains(substring, "-") { - from_to := strings.Split(substring, "-") + if strings.Contains(substring, ":") { + from_to := strings.Split(substring, ":") if len(from_to) != 2 { return s } - from, err := strconv.ParseInt(from_to[0], 10, 32) - if err != nil { - return s + fromStr := from_to[0] + var hasFrom bool = true + if fromStr == "" { + hasFrom = false } - to, err := strconv.ParseInt(from_to[1], 10, 32) - if err != nil { + from64, err := strconv.ParseInt(fromStr, 10, 32) + var from = int(from64) + if hasFrom && err != nil { return s + } else if from < 0 { + from = len(asRunes) + from + } + toStr := from_to[1] + var hasTo bool = true + if toStr == "" { + hasTo = false + } + to64, err := strconv.ParseInt(toStr, 10, 32) + var to = int(to64) + if hasTo && err != nil { + return s + } else if to < 0 { + to = len(asRunes) + to + } + if hasFrom && hasTo { + sb.WriteString(string(asRunes[from:to])) + } else if hasFrom { + sb.WriteString(string(asRunes[from:])) + } else if hasTo { + sb.WriteString(string(asRunes[:to])) } - sb.WriteString(string(asRunes[from:to])) } else { pos, err := strconv.ParseInt(substring, 10, 32) - if err != nil { + if err != nil || pos < 0 { return s } sb.WriteRune(asRunes[pos]) diff --git a/scraping_test.go b/scraping_test.go new file mode 100644 index 0000000..e90486c --- /dev/null +++ b/scraping_test.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "testing" +) + +func TestFilterSubstring(t *testing.T) { + var tests = []struct { + Input string + Query string + Want string + }{ + {"0123456789", "0", "0"}, + {"0123456789", "9", "9"}, + {"0123456789", "0,9", "09"}, + {"0123456789", "0:3", "012"}, + {"0123456789", ":3", "012"}, + {"0123456789", "3:", "3456789"}, + {"0123456789", "-3:", "789"}, + {"0123456789", ":-3", "0123456"}, + {"0123456789", ":-1", "012345678"}, + + {"0123456789", "0,3,7,9", "0379"}, + {"0123456789", "0:3,7,9", "01279"}, + + {"世界", "1", "界"}, + {"世界日本語", ":3", "世界日"}, + {"世界日本語", ":-1", "世界日本"}, + {"世界日本語", "-1:", "語"}, + + {"0123456789", "A", "0123456789"}, + {"0123456789", "1:A", "0123456789"}, + {"0123456789", "A:1", "0123456789"}, + {"0123456789", "A:B", "0123456789"}, + {"0123456789", "A:B:C", "0123456789"}, + } + + for _, test := range tests { + testname := fmt.Sprintf("%s %s", test.Input, test.Query) + t.Run(testname, func(t *testing.T) { + result := getFilterResultSubstring( + test.Input, + &Filter{ + From: test.Query, + }, + ) + if result != test.Want { + t.Errorf("Got %s, want %s", result, test.Want) + } + }) + } +}